代码之家  ›  专栏  ›  技术社区  ›  Mikael Svenson

为什么使用句柄构造函数的文件流上的name属性是<unknown>

  •  0
  • Mikael Svenson  · 技术社区  · 14 年前

    假设您从某个外部dll获取一个文件句柄并实例化 FileStream 带着它。它对阅读和写作都很有用。

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

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

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

    我知道简短的答案,因为它没有实现。私人领域 _fileName 属于 文件流 从未在这些构造函数中分配。

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

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Hans Passant    14 年前

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

    实际上是可能的,SysInternals的handle实用程序可以做到这一点。它没有被记录的原因是内核句柄表的结构是高度可变的,它在每个Windows版本中都发生了变化。而且,最重要的是,因为它允许对文件句柄进行非常不安全的操作,这种操作会破坏文件系统的完整性。人们将使用它关闭另一个进程拥有的文件句柄,以消除文件锁定问题。

    您可能可以通过谷歌NtQuerySystemInformation来了解如何执行此操作。如果您打算使用硬盘,请每天备份硬盘。