文件移动 - OS 如何知道是更新主文件 table 还是复制和删除?

File move - How does the OS know whether to update a master file table or copy and delete?

在阅读了有关如何判断两个文件是否位于同一物理卷上的问题后,发现这(几乎)不可能(例如 here),我想知道 OS 知道文件移动操作是否应该更新主文件 table(或其等效文件)或是否复制和删除。

Windows 是否以某种方式将其委托给驱动器? (或者 OS 是否有关于每个文件的信息,只是程序无法访问它?不太可能。)

或者 - Windows 是否只知道某些类型的驱动器(以及在其他情况下的复制和删除)?在这种情况下,我们也可以假设相同。例如,这意味着允许文件移动而不使用后台线程。 (因为它几乎是瞬时的。)

我正在努力更好地理解这个主题。如果我做出了一些基本的错误假设 - 请纠正它本身就是一个答案。

如果需要限制范围,让我们专注于 Windows 7 及更高版本,以及 NTFS 和 FAT 驱动器。

OS 确实有关于每个文件的信息,只是您的程序无法轻松访问它。不是以任何可移植的方式,也就是说。

这样看:那些文件归系统所有。系统分配 space,管理卷和索引。如果文件最终位于同一个物理卷中,它不会复制和删除文件,因为移动文件效率更高。它只会在需要时复制和删除。

在 C 或 C++ 中 Windows 我首先尝试 MoveFileEx 而不设置 MOVEFILE_COPY_ALLOWED。如果不能通过重命名移动文件,它将失败。如果重命名失败,我知道这可能需要一些时间并显示一些进度条等。

.NET 中没有这样的重命名 AFAIK,如果您在不同的卷之间移动,.NET 的 System::IO::File::Move 不会失败。

首先,关于是否Windows以某种方式将其委托给驱动器 .不。 OS 更像是一个中枢神经系统。它跟踪集中发生的事情,以及它的分布式资产(或设备),如驱动器。 (内部或外部)

由此可见,OS 具有有关其已成功枚举的驱动器上的每个文件的信息. OS 中与文件访问最相关的部分是 File System. There are several types。了解以下主题将有助于理解有关文件访问的问题:
1) File attribute settings
2) User Access Controls
3) 文件位置 (pdf )(与用户访问控制相关)
4) 文件的当前状态(即当前正在使用的文件)
5) Access Control Lists

关于 将接近瞬时。这显然只是一种认知。无论多快,或看似同步,通过标准编程库的文件处理都可以以意识到文件相关错误的方式完成,例如:

ENOMEM - insufficient memory.
EMFILE - FOPEN_MAX files open already.
EINVAL - filename is NULL or contains only whitespace.
EINVAL - invalid mode.  

(这些与 fopen 相关)可用于缓解 OS/file 运行 时间问题。话虽如此,应用程序的编写应始终遵循良好的编程方法,以避免遇到 OS 相关的文件访问问题,包括线程安全问题。

操作系统当然知道哪个驱动器(以及该驱动器上的哪个分区)包含任何特定的本地文件;否则,它如何读取数据? (对于远程文件,操作系统不知道驱动器,但它知道联系哪个服务器。不同服务器之间的移动被实现为复制和删除;同一服务器上的移动要么是复制和删除或委托给该服务器,具体取决于使用的协议。)

此信息也可供应用程序使用。您可以使用 GetFileInformationByHandle() 函数获取包含特定文件的卷的序列号。