在阅读了有关如何判断两个文件是否在同一物理卷上的问题,并且看到它(几乎)不可能(例如here)后,我想知道操作系统是如何知道的文件移动操作应更新主文件表(或其等效文件)或是否复制和删除。
Windows是否以某种方式将其委托给驱动器? (或者操作系统确实有关于每个文件的信息,并且程序无法访问它?不太可能。)
或者 - Windows是否只知道某些类型的驱动器(以及其他情况下的复制和删除)?在这种情况下,我们也可以假设相同。例如,这意味着允许在不使用后台线程的情况下移动文件。 (因为它将近乎瞬间。)
我正在努力更好地理解这个主题。如果我正在做一些基本的错误假设 - 请纠正这本身就是一个答案。
如果需要限制范围,让我们专注于Windows 7及更高版本,以及NTFS和FAT驱动器。
答案 0 :(得分:1)
操作系统确实有关于每个文件的信息,并且它不是您的程序可以轻松访问的。不是以任何便携方式,即。
以这种方式查看:这些文件归系统所有。系统分配空间,管理卷和索引。如果文件最终位于同一物理卷中,则不会复制和删除该文件,因为移动文件效率更高。它只会在需要时复制和删除。
答案 1 :(得分:1)
在C或C ++ for Windows中,我首先尝试设置MOVEFILE_COPY_ALLOWED
MoveFileEx
。如果无法通过重命名移动文件,则会失败。如果重命名失败,我知道可能需要一些时间并显示一些进度条等。
在.NET中没有这样的重命名AFAIK,如果你在不同的卷之间移动,System::IO::File::Move
的.NET不会失败。
答案 2 :(得分:1)
当然操作系统知道哪个驱动器(以及该驱动器上的哪个分区)包含任何特定的本地文件;否则,它怎么能读取数据呢? (对于远程文件,操作系统不知道驱动器,但它确实知道要联系哪个服务器。不同服务器之间的移动实现为复制和删除;在同一服务器上移动是复制和-delete或委派给该服务器,具体取决于使用的协议。)
此信息也可供应用程序使用。您可以使用GetFileInformationByHandle()函数获取包含特定文件的卷的序列号。
答案 3 :(得分:0)
第一次 ,关于 Windows是否以某种方式将其委托给驱动器。不。操作系统更像是一个中枢神经系统。它跟踪集中发生的事情,以及驱动器等分布式资产(或设备)。 (内部或外部)
以下是操作系统 ,其中包含有关已成功枚举的驱动器上的每个文件的信息。与文件访问相关的操作系统中最相关的部分是 File System 。有 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 /文件运行时问题。话虽如此,应始终编写应用程序以符合良好的编程方法,以避免碰到与OS相关的文件访问问题,包括线程安全。