2016-11-28 136 views
2

我試圖通過內存映射來訪問一個文件作爲char數組,或將其複製到一個緩衝區或任何其他,但這兩個需要文件的大小,很容易,想我,只是使用fseek(文件,0,SEEK_END)。在什麼情況下fseek/ftell或fstat無法獲取文件的大小?

但是:根據C++ Reference「[fseek]的庫實現允許不能有效地支持SEEK_END」,意思是我無法使用該方法獲取文件的大小。

接下來我嘗試了fstat,它不太方便,但至少會提供編譯錯誤而不是運行時問題;但是The Open Group指出fstat不需要爲st_size提供有意義的值。

所以:有沒有人真的遇到過這些方法不起作用的系統?

+0

http://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c – eddiem

+4

Unix系統上的某些文件沒有有意義的文件大小,因爲它們不是磁盤文件。管道的大小是多少?一個插座? '/ proc /'和'/ sys /'中的任何「虛擬」文件?這就是爲什麼所有文件大小的函數都有很大的警告腳註 - 並非所有文件都具有有意義的大小。 –

+0

@ColonelThirtyTwo謝謝,這是有道理的。 –

回答

2

關於沒有報告有效大小的文件的注意事項存在,因爲在Linux中,有很多「文件」,其中「文件大小」不是一個有意義的概念。

主要有兩種情況:

  • 的文件不是一個普通的文件。特別是,管道,套接字和字符設備文件是數據流,數據在讀取時被消耗,而不是放在磁盤上,所以尺寸沒有多大意義。
  • 該文件所在的文件系統不提供文件大小。這在「虛擬」文件系統中尤爲常見,文件內容在讀取時生成,並且沒有磁盤備份。

    要展開,文件系統不一定會將文件內容保留在磁盤上。由於文件系統API是用於表示分層數據的便利API,並且有許多工具可用於對文件進行操作,因此將數據作爲文件層次結構進行公開是有意義的。例如,/proc/包含有關進程(如打開的文件和已用內存)的信息,/sys/包含驅動程序特定的信息和選項(從傳感器採樣率到LED顏色的任何內容)。使用FUSE(UserSpacE中的文件系統),您可以編寫一個文件系統來執行任何操作,從SSH到遠程計算機以將Twitter作爲文件系統公開。

    對於很多這些文件系統,「文件大小」可能沒有多大意義。例如,LED驅動器可能會暴露三個文件red,​​和blue。可以讀取它們以獲取當前顏色或寫入以更改顏色。現在,真的值得爲它們實現文件大小,因爲它們只是RAM中的設置,沒有任何磁盤支持,並且不能被刪除?不是真的。

總之,文件不一定是「磁盤上的東西」。對於許多更高級的文件使用,「文件大小」要麼沒有意義,要麼不值得提供。

相關問題