【问题标题】:Move file from SD card to app internal data (Storage)将文件从 SD 卡移动到应用程序内部数据(存储)
【发布时间】:2012-11-27 16:38:20
【问题描述】:

背景

我需要获取以下文件并将其移动到我的应用程序内部存储中。

mnt/sdcard/下载

我可以通过使用以下方法复制文件,然后从 SD 卡中删除文件来成功实现此目的。

writer = new BufferedWriter(new FileWriter(file));
writer.write(data);
writer.close();

复制大文件时,我需要双倍空间(我没有)。

问题

是否可以“移动”文件(更改目录)而不是复制删除

其他信息 调查我发现的问题:

public boolean renameTo (File newPath)

doc

两条路径都在同一个挂载点上。在 Android 上,应用程序是 尝试在之间进行复制时最有可能遇到此限制 内部存储器和 SD 卡。 quote taken from here

我不知道我是否可以在同一个挂载点上获得两条路径。

【问题讨论】:

  • 这很难看。就公开的 API 而言(即使在涉及应用程序用户 ID 的 unix 级别),外部存储和内部存储是分开的。但是,您对暂时需要双倍空间的担忧表明您拥有更新的设备之一,其中外部存储卷实际上是在内部存储之上模拟的。不幸的是,您可能无法在不复制文件的情况下利用它重新分配这些磁盘块。
  • 谢谢克里斯,这非常有用,因为我怀疑会是这种情况。

标签: java android file move


【解决方案1】:

听起来您正在处理非常大的文件,因此您可能会考虑某种渐进式缩小/增长另一种类型的操作 - 尽管大概只有当您可以检测到完整副本没有足够的空间时。

【讨论】:

  • 虽然我怀疑我会使用渐进式缩小一个文件/增长一个文件。因为如果应用程序被中断(关闭),这将使文件面临损坏的高风险。我相信这是解决方案。
  • 你可能可以让它相当安全,如果你让它在删除它之前写一个块,并且能够从一个半完成的传输中识别一对文件。当然,您应该在后台服务中执行此操作,而不是活动,而不是 UI 线程。该进程仍然可能死亡/崩溃/被杀死,您应该设计从中恢复,但这种可能性要小得多。
【解决方案2】:

我之前尝试过相反的操作(SD 内部,同样的事情),复制然后删除过程是我发现唯一可以工作的过程。我想你不能只是“重命名”是有道理的,因为文件位于不同的物理存储区域(不确定这是否适用于某些 Android 设备上的某些“虚拟”SD 卡)。如果它们位于不同的存储空间,则不能只交换文件头上的指针。

【讨论】:

  • 感谢您的意见 simsam7,很高兴知道我不是唯一面临这些问题的人。
猜你喜欢
  • 2020-01-11
  • 2020-08-24
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多