【问题标题】:Is there no GetFilePointer(Ex) Windows API function?没有 GetFilePointer(Ex) Windows API 函数吗?
【发布时间】:2013-07-16 10:23:30
【问题描述】:

我正在尝试调试一个操作文件的程序。例如,我将文件指针设置为偏移量 4(使用基数 0),但它似乎从偏移量 5 开始。

为了弄清楚发生了什么,我想输入一行以打印出当前文件指针(我没有为这个小项目使用 IDE,只使用 Notepad2 和命令行)。不幸的是,似乎没有一个 Windows API 函数来检索当前文件指针,只有一个来设置它。

我记得能够在 Pascal 中(在 DOS 中)找到当前文件指针,但是如何在 Windows 中的 C++ 中确定当前文件指针?

【问题讨论】:

  • (记录一下,原来它工作正常;我只是使用了错误的测试文件。在我测试完基于大小的模式后,我开始测试基于偏移的模式并忘记开始使用基于偏移量的测试文件而不是基于大小的测试文件。Doh!›_‹)

标签: c++ windows winapi visual-c++ file-pointer


【解决方案1】:

与大多数同时提供 getter 和 setter(在读写意义上)的函数不同,确实没有 GetFilePointerGetFilePointerEx

然而,值可以通过调用SetFilePointer(Ex)来检索。两个SetFilePointer 函数从SetFilePointer 返回返回/输出,但您必须确保指定0 的偏移量, FILE_CURRENT 作为模式。这样,它从它所在的位置移动 0 个字节,然后返回(我不能保证它是否会浪费 CPU 周期和 RAM 来执行零移动,但我认为他们已经优化为不这样做)。

是的,它不一致且令人困惑(并且冗余且设计不佳),但是您可以将其包装在自己的 GetFilePointer(Ex) 函数中:

DWORD    GetFilePointer   (HANDLE hFile) {
    return SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
}


LONGLONG GetFilePointerEx (HANDLE hFile) {
    LARGE_INTEGER liOfs={0};
    LARGE_INTEGER liNew={0};
    SetFilePointerEx(hFile, liOfs, &liNew, FILE_CURRENT);
    return liNew.QuadPart;
}

【讨论】:

  • 您的两个实现都不包含错误处理。对于大于 4GB 的文件,第一个静默失败。两者都不可取。
  • 在很多情况下,您提前知道文件永远不会超过 4 GB。在这种情况下,代码是可以的。
  • 此外,这不是生产代码,它只是用于回答特定问题的示例。错误处理留给读者练习。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2011-07-27
  • 2011-09-25
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多