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