Windows核心编程:获取文件大小

1、CreateFile获取文件的内核对象

2、SetFilePointerEx 移动文件指针到文件头,因为前面ReadFile读取文件的时候会移动文件指针,这里移动了20byte

3、GetFileSizeEx获取文件的逻辑大小

4、GetCompressedFileSize获取文件的物理大小,这个比较有意思的地方就是这个函数的额第二个参数和返回值:

ULARGE_INTEGER定义的是一个64位的无符号数,这个函数的第二个参数就是这个无符号数的高32位,返回值是低32位。

Windows可以处理很大的文件,可达到16EB,但是现实中的文件不可能这么大,所以高32位基本上都是0;

与之对应的GetFileSizeEx的第二个参数是一个有符号的64位值。

int main()
{
    HANDLE handle = CreateFile(TEXT("D:\\testfile\\2.txt"), GENERIC_READ | GENERIC_WRITE, NULL,NULL,OPEN_EXISTING,NULL,NULL);
    if (handle == INVALID_HANDLE_VALUE)
        return -1;
    DWORD type = GetFileType(handle);
    cout << type << endl;   // 1

    BYTE pb[10];
    DWORD dwNumberBytes;
    ReadFile(handle, pb, 10, &dwNumberBytes, NULL); //read 0-9 byte
    ReadFile(handle, pb, 10, &dwNumberBytes, NULL); //read 10-19 byte

    LARGE_INTEGER liDistanceToMove;
    liDistanceToMove.QuadPart = 102400;
    SetFilePointerEx(handle, liDistanceToMove, NULL, FILE_BEGIN); //move file pointer
    SetEndOfFile(handle);

    LARGE_INTEGER fileSize;
    GetFileSizeEx(handle, &fileSize);  //logical size
    cout << "filesize:" << fileSize.HighPart <<" " << fileSize.LowPart << endl;  //filesize:0 102400
    CloseHandle(handle);

	ULARGE_INTEGER uFileSize;
	uFileSize.LowPart = GetCompressedFileSize(L"D:\\testfile\\2.txt", &uFileSize.HighPart);  //physical size
	cout << "uFileSize:" << uFileSize.HighPart << " " << uFileSize.LowPart << endl;  //uFileSize:0 102400
}

 

Guess you like

Origin blog.csdn.net/lxiao428/article/details/103678149