Windows 为什么打开的DLL句柄不能保护文件不被移动?

Windows 为什么打开的DLL句柄不能保护文件不被移动?,windows,winapi,dll,filehandle,Windows,Winapi,Dll,Filehandle,我刚刚遇到了一个令人惊讶的错误,使用API调用加载的DLL文件在加载时被重命名。显然,在一个文件上有一个打开的DLL句柄并不能阻止该文件被重命名,甚至不能移动到另一个路径。但是,它受到保护,不会被删除和移动到其他磁盘。如果发生这种情况,使用DLL的程序将继续正常工作。ProcessExplorer显示DLL句柄的路径会相应更新 此行为不同于Windows中的普通文件句柄。例如,当将一个打开的std::ifstream保存到同一个DLL时,操作系统不再允许重命名。我觉得这种行为非常令人惊讶,我想知

我刚刚遇到了一个令人惊讶的错误,使用API调用加载的DLL文件在加载时被重命名。显然,在一个文件上有一个打开的DLL句柄并不能阻止该文件被重命名,甚至不能移动到另一个路径。但是,它受到保护,不会被删除和移动到其他磁盘。如果发生这种情况,使用DLL的程序将继续正常工作。ProcessExplorer显示DLL句柄的路径会相应更新

此行为不同于Windows中的普通文件句柄。例如,当将一个打开的
std::ifstream
保存到同一个DLL时,操作系统不再允许重命名。我觉得这种行为非常令人惊讶,我想知道是否有人能对此做出解释?我特别感兴趣的是允许这样做的理由,因为我认为跟踪磁盘上的文件比仅仅将其锁定到位更困难。因此,操作系统可能必须积极支持此功能,这意味着必须为它提供一个用例?

它不是一个bug。用于访问文件。将节映射到文件时,无法将其删除(或移动到其他磁盘)。似乎关闭了一个文件句柄(不需要),并且只使用映射节的句柄,因此您可以自由重命名文件,但不能删除它

另一方面,
std::ifstream
使用文件句柄访问文件。并且它不设置重命名和删除操作所需的
文件\u共享\u删除
共享访问


实际上,磁盘上没有对文件的特殊跟踪。文件句柄指向文件,仅此而已。打开文件并获得其句柄后,可以重命名甚至删除该文件,您仍然可以访问该文件(如果文件已被删除,则访问权限有限,但您可以取消删除该文件并拥有完全访问权限)。

这很有意义。实际上,dll上的文件句柄在加载后关闭,只有内存映射仍然存在。还感谢您将
文件\u共享\u删除
作为的选项,我以前不知道这个选项。