Windows 文件操作

LARGE_INTEGER//结构体
BOOL WINAPI GetFileSizeEx(//文件大小
In HANDLE hFile,
Out PLARGE_INTEGER lpFileSize
);//64位,32位弃用

typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  };
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } u;
  LONGLONG QuadPart;//大小
} LARGE_INTEGER, *PLARGE_INTEGER;

        LARGE_INTEGER largeFileSize = { 0 };
        GetFileSizeEx(clsFile.GetHandle(), &largeFileSize);
        std::cout << "File Size:" << largeFileSize.QuadPart << std::endl;

        // 磁盘上占用的大小,可能有磁盘压缩
        largeFileSize.LowPart = GetCompressedFileSizeW(clsFile.GetPath(),(LPDWORD)(&(largeFileSize.HighPart)));
        std::cout << "File Compressed Size:" << largeFileSize.QuadPart << std::endl;

读写

ReadFile(
In HANDLE hFile,
Out_writes_bytes_to_opt(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,//buffer,单位是BYTE,
In DWORD nNumberOfBytesToRead,//读多少BYTE到buffer里去
Out_opt LPDWORD lpNumberOfBytesRead,//成功读取类多少
Inout_opt LPOVERLAPPED lpOverlapped//同步,异步
);

//同步I/O
        // 读
        BYTE bBuffer[MAXBYTE] = { 0 };
        DWORD dwReadSize = 0;
        if(ReadFile(clsFile.GetHandle(), bBuffer, MAXBYTE, &dwReadSize, nullptr))
            std::cout << (char*)bBuffer << std::endl;
        // 写
        DWORD dwWrite = 0;
        if (WriteFile(clsFile.GetHandle(), bBuffer, MAXBYTE, &dwWrite, nullptr))
            std::cout << "写入成功" << std::endl;

64位偏移量
setFilePointerEx()

SetFilePointerEx(
    _In_ HANDLE hFile,
    _In_ LARGE_INTEGER liDistanceToMove,//需要移动多少个字节
    _Out_opt_ PLARGE_INTEGER lpNewFilePointer,//移动完了之后所在的位置
    _In_ DWORD dwMoveMethod//FILE_BEGIN FILE_END FILE_CURRENT
    );

bt用此方法设置与目标文件大小一致

//文件本身大22,设置为1024方便读取传输
        //largeFileSize.QuadPart = 1024;手工设置大小
        SetFilePointerEx(clsFile.GetHandle(), largeBegin, nullptr, FILE_BEGIN);
        SetEndOfFile(clsFile.GetHandle());//设置文件尾

你可能感兴趣的:(笔记)