我有某種類型的只有文件句柄(FILE *)的讀取器。 另一個進程不斷寫入一個我無法控制的文件。C:讀取大於4 GB的文件
現在,當其他進程將圖像附加到該文件時,文件大小很可能很快會超過4 GB的限制。
閱讀器進程使用可從某個數據庫中找到的圖像文件的句柄,偏移量和長度讀取該文件。
我的問題是,讀者如何能夠讀取4GB大小後將出現的文件塊。
我正在使用Win32機器。
編輯: 我也在使用FreeBSD機器。
我有某種類型的只有文件句柄(FILE *)的讀取器。 另一個進程不斷寫入一個我無法控制的文件。C:讀取大於4 GB的文件
現在,當其他進程將圖像附加到該文件時,文件大小很可能很快會超過4 GB的限制。
閱讀器進程使用可從某個數據庫中找到的圖像文件的句柄,偏移量和長度讀取該文件。
我的問題是,讀者如何能夠讀取4GB大小後將出現的文件塊。
我正在使用Win32機器。
編輯: 我也在使用FreeBSD機器。
在FreeBSD上,stdio API不限於32位(4Gb)。
只要您使用64位整數來操縱偏移和長度,您應該沒有問題閱讀過去的4Gb。
如果您正在尋找FILE *,那麼如果您位於32位主機上,則必須使用fseeko()而不是fseek()。 fseek()在32位機器上佔用32位。 fseeko()採用所有FreeBSD體系結構中的64位的off_t
類型。
只需使用Windows上的標準C API,fread
,fwrite
就可以在大文件上正常工作。您需要_fseeki64
才能找到64位的位置。
你也可以使用普通的WinAPI(ReadFile
等),它也可以處理> 4個GiB文件而不會出現問題。
[編輯]:你真正需要的僅僅是一個64位的尋求,這ReadFile
通過OVERLAPPED
結構提供你當然也可以通過使用SetFilePointer
這是_fseeki64
相當於獲得(如一些評論者提及。) 。閱讀/寫作從來都不是問題,不管文件大小,只求。
ReadFile()很少能處理> 4GB的文件,沒有足夠的虛擬內存。當然,你的意思是SetFilePointerEx()。 –
甚至是老式的'SetFilePointer'。 –
@Hans:'ReadFile'採用'OVERLAPPED'參數,'OVERLAPPED'具有64位偏移量。有什麼問題?虛擬內存與它有什麼關係? –
像'sprintf(buf,「%ld」,offset)''一樣使用off_t是安全的。我將在DB中保存buf。 – Mayank
@Mayank,不,如果你使用的是32位主機,那將會中斷。使用'sprintf(buf,「%lld」,(long long)offset);' – nos