最近在進行文件斷點續傳的時候用到了fseek來定位文件位置,一開始用小文件測試沒有發現什麼問題,但是用大於2G的文件測試的時候fseek打印出錯,查相關資料,發現fseek的第二個參數類型是long,也就是說只能定位2G以內的文件,另外有兩個類似的函數fseeko和fseeko64,fseeko類似於fseek,不同的是fseeko的第二個參數類型是off_t,另外還有一個宏#define _FILE_OFFSET_BITS 64可以將off_t指定爲64位,從而可以定位大文件,fseeko64則直接支持定位大文件,不幸的是fseeko和fseeko64是實現相關的,至少在我的平臺上fseeko不支持#define _FILE_OFFSET_BITS 64這個宏,更沒有fseeko64這個函數。
考慮到文件是下載到手機上(client端)的,目前的大多數手機也只支持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");
}
}
當然如果文件大於4G,就得另想辦法了!