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

Aja*_*jay 0 c c++ windows winapi handle

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

我该怎么做?

void ProcessHandle(HANDLE hFile)
{
       // Process only if disk file handle
}
Run Code Online (Sandbox Code Playgroud)

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

此句柄不应是管道句柄.

但是,它需要一个大型结构(BY_HANDLE_FILE_INFORMATION)并填充信息.我不是在寻找这些详细信息,因此使用此功能会带来性能损失.

Dav*_*nan 5

对此最简单的API调用是GetFileType.传递你的句柄并将返回值与FILE_TYPE_DISK和比较FILE_TYPE_PIPE.

但是,我非常怀疑你在问题中提到的替代方案之间会有可衡量的性能差异.不要以为呼叫GetFileInformationByHandle会慢一些.首先通过分析检查.

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

  • 我唯一担心的是"GetFileInformationByHandle",他依赖的是一个非严格合同的失败 - 文档说"这个句柄不应该是一个管道处理器.",这意味着没有一个良好的程序甚至应该试图通过管柄.明天他们可以扩展功能,使其即使对管道也能工作,这不会破坏合同(但会打破OP的计划).`GetFileType`似乎是一种更好的方式(最重要的是,它的意图更清晰). (4认同)