谢谢指教!
以前在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;
}
这一次很清晰了,形式上不一样,但是本质上很相近了。
回复 更多评论