謝謝指教!
以前在Win32下做過一段時(shí)間,深感Microsoft的巨大努力給我們帶來的便利:) 海量的MSDN和豐富的Win32 API讓我們遇到問題有據(jù)可查,
同時(shí)也減少了大量"reinvent the wheel"的時(shí)間.
但是到了*nix下面,很多東西都不一樣了,*nix的哲學(xué)是"提供解決問題的機(jī)制而不是具體的實(shí)現(xiàn)",相反,Win32的哲學(xué)是"提供具體的實(shí)現(xiàn)但是不告訴你具體的機(jī)制"。
所以這篇文章的出發(fā)點(diǎn)就是"利用Linux提供的機(jī)制來解決一個(gè)實(shí)際的問題",形式上與Win32的"SetFilePointer & SetEndOfFile"組合不一樣,但是仔細(xì)分析一下,
它們是如此的相似:按照你的建議"先調(diào)用 SetFilePointer(設(shè)置文件邏輯指針位置) 然后調(diào)用 SetEndOfFile(設(shè)置文件物理末端位置)"即可快速擴(kuò)展文件大小。
在上面的代碼中將參數(shù)合法性判斷以及對應(yīng)的函數(shù)調(diào)用狀態(tài)判斷去掉,簡化一下就是下面這樣了:
bool EnlargeFile( int iFileHandle , off_t iNewSize )
{
1. lseek( iFileHandle , 0 , SEEK_CUR ); //保存文件指針的當(dāng)前位置以便于在擴(kuò)展文件大小后恢復(fù)到當(dāng)前位置
2. lseek( iFileHandle , iMoveOffset , SEEK_SET );
3. write( iFileHandle , " " , WRITE_BYTE_COUNT ); //寫入一個(gè)字節(jié)的數(shù)據(jù),完成對文件大小的更改
4. lseek( iFileHandle , iCurPos , SEEK_SET ); //恢復(fù)文件指針到之前保存的文件位置
return true;
}
其中的第1行和第4行是為了在擴(kuò)展文件的過程中保存和恢復(fù)文件指針位置,如果我們將這一點(diǎn)也簡化掉(實(shí)際上必須保留),如下:
bool EnlargeFile( int iFileHandle , off_t iNewSize )
{
// 設(shè)置文件指針(這里是邏輯指針)位置,相當(dāng)于Win32下調(diào)用 SetFilePointer
2. lseek( iFileHandle , iMoveOffset , SEEK_SET );
// 寫入一個(gè)字節(jié)的數(shù)據(jù),完成對文件大小的更改,即是設(shè)置了文件的物理末端指針位置,相當(dāng)于調(diào)用了 SetEndOfFile
3. write( iFileHandle , " " , WRITE_BYTE_COUNT );
return true;
}
這一次很清晰了,形式上不一樣,但是本質(zhì)上很相近了。
回復(fù) 更多評論