C++對文件的操作


Windows API函數

1.創建或打開文件

HANDLE hFile = ::CreateFile(_T("E:\\Program\\測試文件夾\\myfile.txt"), //創建或打開的文件
                                 GENERIC_READ| GENERIC_WRITE,   //文件存取方式(GENERIC_WRITE)
                                 FILE_SHARE_READ,//共享屬性(FILE_SHARE_WRITE/DELETE)
                                 NULL,//安全屬性
                                 OPEN_ALWAYS,//文件存在或不存在時采取的操作
                                 FILE_ATTRIBUTE_NORMAL, //新文件屬性
                                 NULL);//文件模板的句柄 //文件存在或不存在時采取的操作有:(CREATE_ALWAYS OPEN_ALWAYS (總能成功)// CREATE_NEW OPEN_EXISTING TRUNCATE_EXISTING(可能失敗)) //文件屬性有:FILE_ATTRIBUTE_(歸檔,隱藏,只讀,系統,臨時) //可以加上對文件操作方式:FILE_FLAG_(關閉后立即清除,異步讀寫文件,不使用緩存直接寫硬盤)
if (hFile == INVALID_HANDLE_VALUE) { ::MessageBox(NULL, _T("不能夠打開文件!"), _T("錯誤"), IDYES); }

2.讀寫文件+移動文件指針

 CHAR wbuffer[256] = { 'a','b','c','d','e','f','g','g','h','i','j',' ', ' ',' ' ,' ',' ','0' }; DWORD wByte; ::WriteFile(hFile, wbuffer, 256, &wByte, NULL); ::SetFilePointer(hFile, //文件句柄
                0,          //移動距離 (移動TXT時候只是在同一行,不會換行)
                NULL,           //移動距離的高32位
                FILE_BEGIN);    //移動的模式(FILE_(BEGIN\CURRENT\END)何處開始移動) //返回值是新的文件指針位置或-1(失敗)
 CHAR rbuffer[256] = {}; DWORD rByte; ::ReadFile(hFile, &rbuffer, 256, &rByte, NULL); ::SetEndOfFile(hFile);//移動文件結束標志EOF至文件指針位置 //SetFilePointer+SetEndOfFile可以用來截斷或者擴展文件 //讀寫都是從文件指針位置開始的

3.鎖定+解鎖文件(阻止其他程序讀寫)

            ::LockFile(hFile,               //主要防止其他進程讀寫
                        0,      //起始位置
                        0, 1024,   //區域大小
                        0); ::UnlockFile(hFile,0,0,1024,0);

4.常用文件操作

DWORD fileType = ::GetFileType(hFile);//FILE_TYPE_CHAR/DISK/PIPE/UNKNOWN
DWORD fileSizeHigh;  //文件長度的高字
DWORD fileSize = ::GetFileSize(hFile, &fileSizeHigh);//文件長度低字
DWORD fileAttrubutes = ::GetFileAttributes(_T("E:\\Program\\測試文件夾\\myfile.txt")); ::CopyFile(_T("E:\\Program\\測試文件夾\\myfile.txt"),   //源文件
            _T("E:\\Program\\測試文件夾\\Copyfile.txt"), //目標文件
            FALSE);                              //若目標文件存在是否按出錯處理
::DeleteFile(_T("E:\\Program\\測試文件夾\\Copyfile.txt"));//只能刪除存在且非只讀文件
::MoveFile(_T("E:\\Program\\測試文件夾\\myfile.txt"), _T("E:\\Program\\測試文件夾\\測試目錄\\myfile.txt"));//(失敗)
::MoveFileEx(_T("E:\\Program\\測試文件夾\\測試目錄\\myfile.txt"), _T("E:\\Program\\測試文件夾\\myfile.txt"), MOVEFILE_REPLACE_EXISTING);//如果文件已經存在就替換 //MOVEFILE_DELAY_UNTIL_REBOOT 直到重啟再移動(若想下次啟動就刪除文件則第二個參數設置為NULL) //MOVEFILE_WRITE_THROUGH 直到原文件從磁盤刪除再返回
::CloseHandle(hFile);//使用完畢就釋放句柄

5.MFC對文件的操作(讀寫+移動指針)

//MFC CFile類
CFile file,file1; file.Open(_T("E:\\Program\\測試文件夾\\CFilemyfile.txt"), CFile::modeReadWrite | CFile::modeCreate|CFile::shareDenyWrite); //默認是獨占方式並且存在的文件長度會被截為0 (可以設置共享模式shareDenyNone等)
CFileException e; file1.Open(_T("E:\\Program\\測試文件夾\\myfile.txt"), CFile::modeRead | CFile::modeCreate|CFile::modeNoTruncate,&e); //CFile::modeNoTruncate長度不會被截為0
 BYTE buffer1[4096] = { "abcdefghijklmnopqrstuvwxyz" }; file.Write(buffer1, 4096);  //
file.Seek(0, FILE_BEGIN);   //移動文件指針
BYTE buffer[4096]; UINT nBytesRead = file.Read(buffer, sizeof(buffer));  //讀,返回未讀取字節數
file.Close();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM