在特定的函数中,我正在接收一个文件HANDLE,我想检查这个文件句柄是否是真正的磁盘文件句柄,而不是管道句柄。可以保证它不是磁盘文件句柄,也可能是管道句柄,而不是任何其他类型的句柄。
我该怎么做呢?
void ProcessHandle(HANDLE hFile)
{
// Process only if disk file handle
}函数GetFileInformationByHandle将检索文件句柄信息,如果句柄是管道句柄,则会失败,如文档所示:
这个手柄不应该是管道手柄。
然而,它需要一个大的结构(BY_HANDLE_FILE_INFORMATION),并将填充信息。我不寻找这个详细的信息,所以使用这个功能是一个性能的打击。
发布于 2017-06-12 06:23:28
这方面最简单的API调用是GetFileType。传递句柄,并将返回值与FILE_TYPE_DISK和FILE_TYPE_PIPE进行比较。
然而,我非常怀疑你在问题中提到的备选方案之间是否会有可衡量的绩效差异。不要假设调用GetFileInformationByHandle会慢一些。先检查侧写。
当然,使用GetFileInformationByHandle是推断文件类型的一种有点迂回的方法。有一个很好的理由认为,GetFileType是一个更好的选择,因为它直接获取您需要的信息。实际上,正如在各种注释中所讨论的,GetFileInformationByHandle在功能上似乎不能满足您的需求。所以,使用GetFileType。
https://stackoverflow.com/questions/44492533
复制相似问题