【发布时间】:2017-06-12 06:18:18
【问题描述】:
在一个特定的函数中,我收到了一个文件HANDLE,我想检查这个文件句柄是不是真正的磁盘文件句柄而不是管道句柄。保证它要么是磁盘文件句柄,要么是管道句柄,而不是任何其他类型的句柄。
我该怎么做?
void ProcessHandle(HANDLE hFile)
{
// Process only if disk file handle
}
函数GetFileInformationByHandle 将检索文件句柄信息,如果句柄是管道句柄,则会失败,如文档所述:
此句柄不应是管道句柄。
但是,它需要一个大型结构 (BY_HANDLE_FILE_INFORMATION) 并且会填充信息。我不是在寻找这些详细信息,因此使用此功能会影响性能。
【问题讨论】:
-
快速浏览,该结构是 13 个 dwords;与系统调用开销相比,复制 52 个字节的影响可以忽略不计。除非你有确凿的数据证明这是你的瓶颈,否则你方式在考虑这个问题。
-
这是一个系统调用。这比复制几个字节要密集几个数量级。
-
如果您不喜欢咨询甲骨文,那就不要。添加
BOOL isfile参数。你不知道,但调用者可以知道。 -
另外,仅供参考:ithare.com/infographics-operation-costs-in-cpu-clock-cycles;注意系统调用在哪里,水平刻度是对数的。
-
@Ajay 你在哪里有证据表明在堆栈上传递几个字节是你的程序的瓶颈?
标签: c++ c windows winapi handle