2011-07-03 96 views
4

我有某種類型的只有文件句柄(FILE *)的讀取器。 另一個進程不斷寫入一個我無法控制的文件。C:讀取大於4 GB的文件

現在,當其他進程將圖像附加到該文件時,文件大小很可能很快會超過4 GB的限制。

閱讀器進程使用可從某個數據庫中找到的圖像文件的句柄,偏移量和長度讀取該文件。

我的問題是,讀者如何能夠讀取4GB大小後將出現的文件塊。

我正在使用Win32機器。

編輯: 我也在使用FreeBSD機器。

回答

2

在FreeBSD上,stdio API不限於32位(4Gb)。

只要您使用64位整數來操縱偏移和長度,您應該沒有問題閱讀過去的4Gb。

如果您正在尋找FILE *,那麼如果您位於32位主機上,則必須使用fseeko()而不是fseek()。 fseek()在32位機器上佔用32位。 fseeko()採用所有FreeBSD體系結構中的64位的off_t類型。

+0

像'sprintf(buf,「%ld」,offset)''一樣使用off_t是安全的。我將在DB中保存buf。 – Mayank

+0

@Mayank,不,如果你使用的是32位主機,那將會中斷。使用'sprintf(buf,「%lld」,(long long)offset);' – nos

5

只需使用Windows上的標準C API,fread,fwrite就可以在大文件上正常工作。您需要_fseeki64才能找到64位的位置。

你也可以使用普通的WinAPI(ReadFile等),它也可以處理> 4個GiB文件而不會出現問題。

[編輯]:你真正需要的僅僅是一個64位的尋求,這ReadFile通過OVERLAPPED結構提供你當然也可以通過使用SetFilePointer這是_fseeki64相當於獲得(如一些評論者提及。) 。閱讀/寫作從來都不是問題,不管文件大小,只求。

+0

ReadFile()很少能處理> 4GB的文件,沒有足夠的虛擬內存。當然,你的意思是SetFilePointerEx()。 –

+0

甚至是老式的'SetFilePointer'。 –

+1

@Hans:'ReadFile'採用'OVERLAPPED'參數,'OVERLAPPED'具有64位偏移量。有什麼問題?虛擬內存與它有什麼關係? –