如何确定如果一个文件将在逻辑上移动或实际移动
-
09-09-2019 - |
题
事实:
当文件的移动,还有两个可能性:
- 来源和目的地的文件是在同一个分区和只有文件系统更新索引
- 来源和目的是在两个不同的文件系统和文件需要移动的字节每字节。(又名复制上的移动)
问题:
我怎么能确定如果一个文件将是在逻辑上或物理移动?
我转移大的文件(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?)
不隶属于 StackOverflow