MFC 檔案基本操作的異常情況

2021-06-26 07:42:43 字數 2373 閱讀 1758

檔案操作

1          檔案常見屬性

1.1         唯讀屬性

1.2         系統檔案屬性

1.3         隱藏屬性

通過getfileattributes來獲取

file_attribute_readonly 唯讀屬性

file_attribute_hidden    隱藏屬性

file_attribute_system    系統檔案屬性

去掉唯讀屬性方法

dword dwattri = getfileattributes(_t("filepath"));

if (dwattri & file_attribute_readonly)

//有唯讀屬性

dwattri &= ~file_attribute_readonly;

//去掉唯讀屬性

bool bret = setfileattributes(_t("filepath"),dwattri);

//設定失敗

if (!bret)

dword dwerr = getlasterror();

if (error_access_denied == dwerr)

//沒有許可權

else

//其他情況處理

2          檔案大小

2.1         物理大小

即實際檔案的位元組數,讀取檔案內容時需要用到

使用getfilesize獲取檔案的實際位元組大小

2.2         占用空間

檔案所在磁碟的占用空間大小,跟磁碟的簇大小有關,是簇的最小整數倍。

檔案複製時需要考慮

由於磁碟空間不足寫入失敗的時候判別方法跟占用空間相關。

磁碟簇大小的計算方法:

每簇扇區數 * 每扇區的位元組數

bool winapi getdiskfreespace(

_in_   lpctstr lprootpathname,

_out_  lpdwordlpsectorspercluster,

_out_  lpdword lpbytespersector,

_out_  lpdword lpnumberoffreeclusters,

_out_  lpdword lptotalnumberofclusters

dword dwsectorspercluster = 0;

dworddwbytespersector = 0;

dworddwnumberoffreeclusters = 0;

dworddwtotalnumberofclusters = 0;

getdiskfreespace(

szvolumepathname,            //磁碟根路徑

&dwsectorspercluster,        //每簇的扇區數

&dwbytespersector,            //每扇區的位元組數

&dwnumberoffreeclusters,    //空餘簇的數量

&dwtotalnumberofclusters    //全部簇的數量

//簇大小

dword dwclustersize = dwsectorspercluster *dwbytespersector;

簇數 = 檔案位元組數 / 簇大小結果向上取整

占用空間 = 簇數 * 簇大小

uint64 dwfilespacesize =

static_cast(ceil(ufilesize/ static_cast(dwclustersize)) * dwclustersize);

也可通過getfileinformationbyhandleex 這個api來獲取,不過這個api支援的最低系統版本要求是visita

3          檔案開啟失敗

1.      檔案是唯讀屬性,在檔案開啟的時候使用了「寫」屬性

使用c++標準庫 fstream open檔案時,加入std::ios::out屬性,會引起開啟失敗

使用mfc 檔案操作類cfile open檔案時,cfile::modereadwrite或cfile::modewrite

處理辦法:

如果只需要讀取,去掉「寫」屬性,保留「讀」屬性

對應fstream 去掉 out 標示

cfile 改為cfile::moderead

如需對同乙個檔案讀寫操作,先去掉唯讀屬性,參考前面的方法。

2.      沒有許可權進行開啟。

a.使用者許可權不足。

b.檔案正在被獨佔式訪問。

處理辦法:

異常處理,記錄日誌

4          檔案寫入失敗

先考慮磁碟空間不足的情況。

浮點異常情況(VX FP TASK)

總結 在生成任務時,如果在任務中使用浮點計算,一定需要將任務的標誌vx fp task設定,否則將會出錯,主要是在其他任務中出現0 0錯誤 產生原因 當沒有設定浮點計算標識vx fp task時,在進入任務時沒有儲存浮點暫存器值,這樣在任務中進行浮點運算將破壞了浮點暫存器的內容,而在任務退出後,浮點...

python 異常情況處理

def ceshi number input 請輸入乙個數字 number int number try 裡面是有可能有異常的 try result 10 number except 是異常捕獲,多個except也只能執行乙個 except valueerror print 請輸入整數 except...

fwrite flock異常情況測試

更名操作 兩個程序都開啟檔案之後,乙個鎖住 iotest 乙個等待鎖 iotest2 此時修改檔案iotest.log的名字 更名操作 iotest程序開啟檔案並鎖住檔案,iotest2不開啟檔案,此時修改檔案iotest.log的名字 刪除操作 兩個程序都開啟檔案,乙個程序鎖住 iotest 乙個...