事实:

当文件的移动,还有两个可能性:

  1. 来源和目的地的文件是在同一个分区和只有文件系统更新索引
  2. 来源和目的是在两个不同的文件系统和文件需要移动的字节每字节。(又名复制上的移动)

问题:

我怎么能确定如果一个文件将是在逻辑上或物理移动?

我转移大的文件(700多兆),并将采取一种不同的行为为每一种情况。


编辑:

我已经编码的运动文件中的对话与一线工作人员执行的阻io呼叫复制文件的一梅格的时间。它提供信息的用户喜欢粗略的估计剩余时间及传送速率。

问题是:我怎么知道如果该文件可以移动的逻辑之前移动它?

有帮助吗?

解决方案 2

Ok我的东西:)

使用 南国防军 我能够 呼叫Win32API (并且*nix API过) 从java.

我试着打电话给 GetFileInformationByHandle 并没有得到一个结果,但的 dwVolumeSerialNumber 属性始终等于0(试着用我的C:和D:驱动)

然后我看到这个功能上MSDN: MoveFileEx.当国旗parametter设定为0,上的副本移动功能将被禁止。 和它的工作原理!!!!

因此,我将只叫

if (!Kernel32.INSTANCE.MoveFileEx(source.getAbsolutePath(), destination.getAbsolutePath(), 0)) {
    System.out.println("logical move failed");
}

这里是代码放在 Kernel32.java 接口(此文件中可以找到的src.zip 包在下载的部分 南国防军 网站):

boolean MoveFileEx(String lpExistingFileName, String lpNewFileName, int dwFlags);

int MOVEFILE_REPLACE_EXISTING = 0x01;
int MOVEFILE_COPY_ALLOWED = 0x02;
int MOVEFILE_CREATE_HARDLINK = 0x04;
int MOVEFILE_WRITE_THROUGH = 0x08;
int MOVEFILE_DELAY_UNTIL_REBOOT = 0x10;
int MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20;

其他提示

在Linux上或其他*nices,呼叫 stat() 关于来源和目的目录和比较他们 st_dev 值。如果他们是一样的,一个合乎逻辑的行动能够执行,否则,物理副本,删除必须执行。

在Windows,你可以打电话 GetFileInformationByHandle() 在处理两个目录和比较他们 dwVolumeSerialNumber 值。请注意,这需要Windows2000年或以后。

我看到你在使用--必须有一些门户网站,通过它可以访问这个系统级的信息(也许JNI?)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top