關於fseek不能定位大於2G文件的問題

        最近在進行文件斷點續傳的時候用到了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,就得另想辦法了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章