2012-10-18 83 views
1

我正在嘗試獲取正在由另一個進程下載的文件的大小。我用下面的代碼(這是我在here找到):文件的實際大小

os.stat(filepath).st_blocks*512 

但是,它也返回該文件的分配的大小。經過最近的檢查,我發現這個解決方案的準確性取決於它正在處理的操作系統。目前,我的操作系統是帶有ext3文件系統的Ubuntu 12.04服務器。有沒有另一種方法來在Python中找到真正的文件大小?

+0

您看到大小錯誤的原因可能是下載應用程序一次爲整個文件分配空間。除非你能連接下載過程,否則我不確定你會怎麼做? –

+0

也許,但事情是這種方法在另一個發行版中正常工作。 – Hgeg

+0

使用相同的下載應用程序,相同的版本和所有? –

回答

1

嘗試

os.stat(filepath).st_size 

似乎它返回你在看到 「ls -l命令」

+0

它不起作用。我得到相同的輸出。 – Hgeg

+1

我從ls -l得到的東西也不是我想要的。 – Hgeg

0

獨立的你的話,你可以訪問到文件的元數據:

metadata = os.stat(path_to_file) 
metadata.st_size 
+0

它也沒有工作。 – Hgeg

+0

@Hgeg然後好像它不是您想要的file_的_actual大小。 –

+0

我的意思是我想知道它在硬盤上分配了多少空間,而不是存儲在inode中的文件大小,這是我當前獲得的值。 – Hgeg

6

來自documentation for stat()

在一些Unix系統(如Linux),以下屬性也可以是可用的:

  • 的st_blocks - 數的分配用於文件
  • 512字節塊
  • st_blksize - 文件系統塊大小
  • st_rdev - 設備的類型,如果一個inode設備
  • st_flags - 對於文件
  • 用戶定義的標誌10

你似乎想要的是st_blocks * st_blksize。請注意,這是而不是該文件的實際大小,即st_size成員。塊的數量乘以塊大小將是大於比實際的文件大小。


注:當它說: 「的st_blocks - 分配文件512字節的塊號」,號碼512實際上是依賴於系統的。 The POSIX specification

的單元,用於將的st_blocks的STAT結構的部件並不內POSIX.1-2008定義。在一些實現中它是512字節。它可能在文件系統的基礎上有所不同。

如果st_block屬性可用,那麼不要驚訝,如果它是一些其他值。

+0

無論「st_blksize」如何,似乎''file_stat.st_blocks * 512''都會給出正確的結果。統計手冊頁面(https://linux.die.net/man/2/stat)還將''st_blksize''簡單地描述爲''首選'blocksize for efficient file system I/O'。 – MisterMiyagi

相關問題