确定文件句柄是否为管道句柄
Determine if file HANDLE is a pipe handle
在特定函数中,我收到一个文件HANDLE
,我想检查这个文件句柄是否是真正的磁盘文件句柄而不是管道句柄。可以保证它是磁盘文件句柄,也可能是管道句柄,而不是任何其他类型的句柄。
我该怎么做?
void ProcessHandle(HANDLE hFile)
{
// Process only if disk file handle
}
函数 GetFileInformationByHandle 将检索文件句柄信息,如果句柄是管道句柄,则会失败,如文档所示:
此句柄不应是管道句柄。
然而,它需要一个大的结构(BY_HANDLE_FILE_INFORMATION
(,并且会填充信息。我不是在寻找这些详细信息,因此使用此函数会影响性能。
最简单的
API 调用是 GetFileType
。传递句柄并将返回值与 FILE_TYPE_DISK
和 FILE_TYPE_PIPE
进行比较。
但是,我非常怀疑您在问题中提到的替代方案之间是否存在可衡量的性能差异。不要以为呼叫GetFileInformationByHandle
会更慢。首先通过分析进行检查。
当然,您使用GetFileInformationByHandle
是推断文件类型的一种迂回方式。有一个很好的论点认为GetFileType
是一个更好的选择,因为它可以直接获取您需要的信息。事实上,正如各种评论中所讨论的那样,GetFileInformationByHandle
似乎在功能上不能满足您的需求。因此,请使用 GetFileType
.
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- 确定文件句柄是否为管道句柄
- 如何检查文件指针/描述符/句柄是否关联到同一个文件/管道/终端
- 比较两个命名的管道句柄