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());//設置文件尾
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章