假设您从某些外部DLL获取文件句柄并使用它实例化FileStream
。它适用于阅读和写作。
然后,您需要该句柄的路径和名称,并尝试访问FileStream对象的Name属性,并返回“unknown”。
对于采用文件句柄的构造函数来说,这是正确的:
public FileStream(IntPtr handle, ...
public FileStream(SafeFileHandle handle, ...
我知道简短的回答,因为它没有实现。 _fileName
的私有字段FileStream
永远不会在这些构造函数中分配。
似乎API从句柄中获取名称涉及多行代码,但我仍然认为他们可能不愿意将其包括在内。
所以真正的问题是:为什么不呢?或者他们只是忘了?
答案 0 :(得分:1)
没有记录的方法来获取与文件句柄关联的文件名。您链接的示例只能用于内存映射文件,它依赖于GetMappedFileName()API函数。常规文件句柄不存在此类API。
事实上,SysInternals的Handle实用程序可以做到这一点。没有记录的原因是内核句柄表的结构是高度可变的,它已针对每个Windows版本进行了更改。而且,最重要的是,因为它会允许对文件句柄进行极其不安全的操作,这种操作会破坏文件系统的完整性。人们将使用它来关闭另一个进程拥有的文件句柄,以消除文件锁定问题。
你可以通过谷歌搜索NtQuerySystemInformation找到如何做到这一点。如果您考虑使用它,请每天备份硬盘。