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

标签 c++ c windows winapi handle

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

我该怎么做?

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

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

This handle should not be a pipe handle.

但是,它需要一个大结构 (BY_HANDLE_FILE_INFORMATION) 并且会填充信息。我不是在寻找此详细信息,因此使用此功能会影响性能。

最佳答案

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

但是,我非常怀疑您在问题中提到的备选方案之间会有可衡量的性能差异。不要假设调用 GetFileInformationByHandle 会变慢。首先通过分析进行检查。

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

关于c++ - 确定文件 HANDLE 是否为管道句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44492533/

相关文章:

c++ - 覆盖删除行为

c++ - 从函数调用返回后,来自 std::vector 引用的数据损坏

c++ - 将数组与整数打印为十六进制

c - 这个段错误的原因是什么?

c - C 中的 N 叉树

c - 读取文件: Run-Time Check Failure #2 - Stack around the variable 'delta_c' was corrupted时运行时错误

C# Maze Generation 我自己实现的Prim的算法Bug

c++ - boost 进程运行 su

windows - ffmpeg - 从视频中创建 x 个拇指 (Windows)

asp.net-mvc - ASP.NET MVC Windows 身份验证 403 禁止 : Access is denied