为什么在使用句柄构造函数的FileStream上,Name属性是<unknown>?</unknown>

时间:2010-04-10 15:52:06

标签: .net winapi filestream

假设您从某些外部DLL获取文件句柄并使用它实例化FileStream。它适用于阅读和写作。

然后,您需要该句柄的路径和名称,并尝试访问FileStream对象的Name属性,并返回“unknown”。

对于采用文件句柄的构造函数来说,这是正确的:

public FileStream(IntPtr handle, ...
public FileStream(SafeFileHandle handle, ...

我知道简短的回答,因为它没有实现。 _fileName的私有字段FileStream永远不会在这些构造函数中分配。

似乎API从句柄中获取名称涉及多行代码,但我仍然认为他们可能不愿意将其包括在内。

所以真正的问题是:为什么不呢?或者他们只是忘了?

1 个答案:

答案 0 :(得分:1)

没有记录的方法来获取与文件句柄关联的文件名。您链接的示例只能用于内存映射文件,它依赖于GetMappedFileName()API函数。常规文件句柄不存在此类API。

事实上,SysInternals的Handle实用程序可以做到这一点。没有记录的原因是内核句柄表的结构是高度可变的,它已针对每个Windows版本进行了更改。而且,最重要的是,因为它会允许对文件句柄进行极其不安全的操作,这种操作会破坏文件系统的完整性。人们将使用它来关闭另一个进程拥有的文件句柄,以消除文件锁定问题。

你可以通过谷歌搜索NtQuerySystemInformation找到如何做到这一点。如果您考虑使用它,请每天备份硬盘。