【问题标题】:File move - How does the OS know whether to update a master file table or copy and delete?文件移动 - 操作系统如何知道是更新主文件表还是复制和删除?
【发布时间】:2015-02-02 19:04:55
【问题描述】:

在阅读了有关如何判断两个文件是否在同一个物理卷上的问题并看到它(几乎)不可能(例如here)之后,我想知道操作系统如何知道一个文件移动操作应更新主文件表(或其等效项)或是否复制和删除。

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

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

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

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

【问题讨论】:

  • 旁注:您可能更有机会从社区的 C/C++ 部分获得答案... C#/.Net 开发人员通常不需要(如“不能真正影响”) 了解这些内部细节。
  • @AlexeiLevenkov 谢谢。相应地编辑了标签。
  • 您可以添加与语言无关的标签。我尝试为您编辑帖子,但只允许使用 5 个标签。如果您删除上面的任何标签,您可以选择添加它。

标签: c# c++ .net c windows


【解决方案1】:

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

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

【讨论】:

  • 谢谢。 GetFileInformationByHandle() 是否会在驱动器作为文件夹挂载或文件夹分配有“驱动器”号时工作?
  • @ispiro:是的,会的。
【解决方案2】:

操作系统确实包含有关每个文件的信息,但您的程序并不容易访问这些信息。不是以任何可移植的方式,也就是说。

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

【讨论】:

【解决方案3】:

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

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

【讨论】:

  • 我不是 C/C++ 方面的专家,但您提供的链接明确指出:“您可以使用重命名将文件从一个目录 或设备 移动到另一个” .
  • @ispiro 你是对的。我查看了库,发现我使用了没有 MOVEFILE_COPY_ALLOWED 的 MoveFileEx。老头。抱歉,修正了我的文字。
  • 感谢您的更新。 +1。 MoveFileEx 文档中的措辞“如果要将文件移动到不同的卷”可能意味着(通常)会有所不同,甚至可能是操作系统实际上不会进一步检查那个。
【解决方案4】:

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

因此,操作系统 拥有有关其已成功枚举的驱动器上的每个文件的信息。操作系统中与文件访问最相关的部分是 File System。有several types。了解以下主题将有助于了解有关文件访问的问题:
1) File attribute settings
2) User Access Controls
3) 文件位置 (pdf)(与用户访问控制相关)
4) strong> 文件的当前状态(即当前正在使用的文件)
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 相关)可用于缓解操作系统/文件运行时问题。话虽如此,应用程序的编写应始终遵循良好的编程方法,以避免遇到与操作系统相关的文件访问问题,包括线程安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多