检测File.Move是否需要"复制 - >删除"或仅更改文件系统表中的位置

JHu*_*d80 6 c# filesystems file-io

免责声明:我会马上承认,我对文件系统如何运作的细节有相当多的无知.我一直在使用NTFS,以至于我可以根据我亲眼目睹的行为推断出正在发生的事情,以及我从互联网上的dorking所学到的一切 - 但是......

我希望有一种方法可以检测是否将文件从"位置A"移动到"位置B",操作是否需要等效的"File.Copy - > File.Delete"或者是否不会复制实际的文件数据,但只是更新"主文件表"中的位置等.

出于各种目的,我有时会移动大量的大文件.我想在UI中报告进度.

我意识到,当我调用File.Move并将文件从一个磁盘/分区上的某个位置移动到另一个磁盘/分区时,该函数将有效地在磁盘/分区之间"复制文件数据 - >删除".当遇到这种情况时,我希望能够检测到这种情况会发生,所以我可以使用我编写的代码来复制文件并在传输字节时提供详细的进度报告,这样我就可以经常更新UI中的进度条.

当它在同一个磁盘/分区上时,因为更新主文件表中的位置是如此之快,我只需在file.Move函数为我批量移动的每个文件完成时更新进度条.

使用.NET 4(C#),是否可以通过其他方式检测调用File.Move是否需要等效的"copy - > delete"操作,或者只是更新文件表而不是复制文件数据?

编辑:

正如我在下面的评论中所指出的,我认为可能做到这一点的可能性是检测给定的源文件位置和目标文件位置是否位于同一物理磁盘和分区上,如果是这样,这是否意味着我可以准确预测行为并决定要调用哪些函数 - 内置的File.Move函数用于"近即时"更新文件系统表,我相信在移动到相同磁盘/部件时会发生这种情况,或者我更详细的'报告进度每'x'字节复制'自定义文件复制代码.文件传输速度在我的程序运行的机器上会有很大差异,所以我希望能够在可能的情况下报告详细的进度/当前的传输速度.

注 - 程序可能正在使用网络UNC路径,这些路径可以使用具有相同根路径的不同物理磁盘,即:\\ somename\shares\workfolder\project可能位于不同的物理磁盘上,然后是\\ somename\shares\workfoldder\otherproject .因此,我需要一种方法来检测分区ID或物理磁盘ID,以查看同一磁盘/分区上的源文件夹和目标文件夹.

谢谢

Rog*_*mbe 2

您始终可以 P/Invoke MoveFileWithProgress。从粗略的阅读来看,当文件被复制而不是移动时,它看起来会为您提供更精细的进度。

或者,总是有SHFileOperation,它将为您提供 Windows 资源管理器 UI 和语义。