Windows API 没有 GetFilePointer(Ex) 函数吗?

问题描述 投票:0回答:2

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

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

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

c++ windows winapi visual-c++ file-pointer
2个回答
21
投票

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

GetFilePointer
GetFilePointerEx

但是,可以通过调用 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;
}

0
投票

由于多年来没有人愿意为@Synetech 发布的基本功能答案发布“固定”解决方案,所以我决定这样做。下面是两个实现,在使用上大致符合相关的SetFilePointer方法,由消费者决定是否关心大于4GB的文件并进行相关的错误处理。

DWORD GetFilePointer(HANDLE hFile, OUT PLONG lpFilePointerHigh)
{
    if (lpFilePointerHigh != NULL)
    {
        /* Ensure lpFilePointerHigh is zero */
        *lpFilePointerHigh = 0;
    }

    return SetFilePointer(hFile, 0, lpFilePointerHigh, FILE_CURRENT);
}

BOOL GetFilePointerEx(HANDLE hFile, OUT PLARGE_INTEGER lpFilePointer)
{
    const LARGE_INTEGER liOfs = { };

    if (lpFilePointer != NULL)
    {
        /* Ensure lpFilePointer is zero */
        lpFilePointer->QuadPart = 0;
    }

    return SetFilePointerEx(hFile, liOfs, lpFilePointer, FILE_CURRENT);
}
© www.soinside.com 2019 - 2024. All rights reserved.