确定文件句柄是否为管道句柄

Determine if file HANDLE is a pipe handle

本文关键字:管道 句柄 是否 文件句柄      更新时间:2023-10-16

在特定函数中,我收到一个文件HANDLE,我想检查这个文件句柄是否是真正的磁盘文件句柄而不是管道句柄。可以保证它是磁盘文件句柄,也可能是管道句柄,而不是任何其他类型的句柄。

我该怎么做?

void ProcessHandle(HANDLE hFile)
{
       // Process only if disk file handle
}

函数 GetFileInformationByHandle 将检索文件句柄信息,如果句柄是管道句柄,则会失败,如文档所示:

此句柄

不应是管道句柄。

然而,它需要一个大的结构(BY_HANDLE_FILE_INFORMATION(,并且会填充信息。我不是在寻找这些详细信息,因此使用此函数会影响性能。

最简单的

API 调用是 GetFileType 。传递句柄并将返回值与 FILE_TYPE_DISKFILE_TYPE_PIPE 进行比较。

但是,我非常怀疑您在问题中提到的替代方案之间是否存在可衡量的性能差异。不要以为呼叫GetFileInformationByHandle会更慢。首先通过分析进行检查。

当然,您使用GetFileInformationByHandle是推断文件类型的一种迂回方式。有一个很好的论点认为GetFileType是一个更好的选择,因为它可以直接获取您需要的信息。事实上,正如各种评论中所讨论的那样,GetFileInformationByHandle似乎在功能上不能满足您的需求。因此,请使用 GetFileType .