可以使用 函数直接设置文件指针。但 Windows 也提供了另一种指定读写文件位置的方法。
ReadFile() 或 WriteFile() 的最后一个参数是一个重叠结构地址。重叠结构定义如下:
[C++] 纯文本查看 复制代码
typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
};
PVOID Pointer;
};
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
所谓重叠结构就是结构体里还有别的结构,如联合(联合里也有其它结构)或其它结构,各种结构嵌套堆叠。
在 OVERLAPPED 中 union 的两个成员 Offset 和 OffsetHigh 组成一个表示 64 位的值。
示例程序:
[C++] 纯文本查看 复制代码
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile;
LARGE_INTEGER filePosition;
OVERLAPPED ov = {0, 0, 0, 0, NULL };
CHAR buffer[256] = {};
DWORD nByte;
filePosition.HighPart = 0;
filePosition.LowPart = 6;
hFile = CreateFile(_T("a.txt"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
ov.Offset = filePosition.LowPart;
ov.OffsetHigh = filePosition.HighPart;
ReadFile(hFile, buffer, 7, &nByte, &ov);
buffer[nByte] = '\0';
printf ("%s\n", buffer);
filePosition.HighPart = 0;
filePosition.LowPart = 14;
ov.Offset = filePosition.LowPart;
ov.OffsetHigh = filePosition.HighPart;
ReadFile(hFile, buffer,6, &nByte, &ov);
buffer[nByte] = '\0';
printf ("%s\n", buffer);
CloseHandle(hFile);
return 0;
}
上面程序中使用的 a.txt 中包含了一句话:hello windows system programming
运行输出:D:\WindowsAPP\getfilesize\Debug>overlapped.exe
windows
system
由此可见,文件的位置由 OVERLAPPED 结构中的 Offset 和 OffsetHigh 两个成员直接给出,这是位置是个绝对值,而不需要像 SetFilePointerEx() 那样对文件指针前后移动。 |