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

时间:2017-06-12 06:18:18

标签: c++ c windows winapi handle

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

我该怎么做?

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

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

  

此句柄不应是管道句柄。

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

1 个答案:

答案 0 :(得分:5)

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

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

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