关于fseek不能定位大于2G文件的问题
????? 最近在進行文件斷點續(xù)傳的時候用到了fseek來定位文件位置,一開始用小文件測試沒有發(fā)現(xiàn)什么問題,但是用大于2G的文件測試的時候fseek打印出錯,查相關(guān)資料,發(fā)現(xiàn)fseek的第二個參數(shù)類型是long,也就是說只能定位2G以內(nèi)的文件,另外有兩個類似的函數(shù)fseeko和fseeko64,fseeko類似于fseek,不同的是fseeko的第二個參數(shù)類型是off_t,另外還有一個宏#define _FILE_OFFSET_BITS 64可以將off_t指定為64位,從而可以定位大文件,fseeko64則直接支持定位大文件,不幸的是fseeko和fseeko64是實現(xiàn)相關(guān)的,至少在我的平臺上fseeko不支持#define _FILE_OFFSET_BITS 64這個宏,更沒有fseeko64這個函數(shù)。
???????? 考慮到文件是下載到手機上(client端)的,目前的大多數(shù)手機也只支持4G以下的文件,所以server端可以用下面代碼解決文件定位:
?? ?/*文件大于2G的時候會有兼容性問題*/
?? ?if(startPos <= 2147483647)
?? ?{?? ?/*順序定位*/
?? ??? ?if(fseek(resource, startPos, SEEK_SET) != 0)
?? ??? ?{
?? ??? ??? ?printf("[partial_cat] fseek error!\n");
?? ??? ?}
?? ?}
?? ?else
?? ?{
?? ??? ?/*逆序定位*/
?? ??? ?long long rStartPos = (fileSize - 1) - startPos;
?? ??? ?if(fseek(resource, rStartPos, SEEK_END) != 0)
?? ??? ?{
?? ??? ??? ?printf("[partial_cat] reverse fseek error!\n");
?? ??? ?}
?? ??? ?
?? ?}
????????? 當(dāng)然如果文件大于4G,就得另想辦法了!
?
總結(jié)
以上是生活随笔為你收集整理的关于fseek不能定位大于2G文件的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言】字节对齐问题(以32位系统为例
- 下一篇: html+正则+换行+回车,正则与回车换