一般來說,一旦文件句柄打開,文件就會打開,並且沒有人更改目錄結構可以更改文件 - 文件可以移動,重新命名或放置其他東西 - 它仍然是通過構建打開的,因爲在Linux/Unix中沒有真正的文件刪除,但只有unlink
,它不一定刪除文件 - 它只是從目錄中刪除鏈接。結果:無論文件發生什麼情況,文件句柄都將保持有效。在文件打開時檢查文件指針在C中的有效性
但是,如果底層設備消失(例如,文件位於從系統中移除的USB存儲棒上),則該文件將不再可用。
我有一個程序,在開始時打開一個巨大的二進制文件(> 4 GB)的其他應用程序。此後,這手錶更改文件,通過查詢
long int pos = fseek(filepointer, 0L, SEEK_END);
經常(每隔幾毫秒),並恢復到以前的位置,如果結果是pos_before
不同。在這種情況下,fgets
用於從文件中讀取新數據。
因此,只掃描文件尾部的變化,使整個過程相當輕量級。但是,它受潛在問題的影響,即如果文件系統發生更改(如上所述),始終打開的文件指針可能會失效。
該代碼不需要可移植到任何非Linux/Unix系統。
問:
- 我如何檢測文件指針仍然有效已經成功打開該文件後(此事件可能是星期前)?我已經看到可以使用
fcntl(fileno(filepointer), F_GETFD)
進行測試。
替代問題:
- 難道是檢測以另一種方式在文件大小的變化是否可行?我能想到用定期
fseek(filepointer, 0L, SEEK_END);
的(可能會很慢,造成大量的I/O),或_filelength(fileno(filepointer));
(不清楚這是否會導致大量的I/O)stat(filename, &st); st.st_size;
(不清楚這是否會導致任何 I/O)
我沒有Linux,但在Windows中,您無法刪除或移動已被另一個進程打開的文件,如果'nix系統不是這種情況,我也會感到驚訝。至於刪除打開文件的介質,這就是您應該始終檢查I/O操作結果的一個原因。 (並詢問系統是否允許刪除媒體)。 –
@WilliamPursell我沒有這樣說,你可以(例如對捲進行碎片整理)。我說你不能刪除已經打開的文件,原因很明顯。 –
@WeatherVane「mov [ing]文件」和更改名稱之間的區別是什麼? –