題 文件大小如何為零?


只是我碰到的東西,無法想到一個正確的解釋。如果我在我的電腦上創建一個空的* .txt文件然後查看它的大小,它會顯示0.但這怎麼可能?我的意思是即使文件本身是空的,它仍然必須有一些大小,只是為了存儲自己的名字。怎麼解釋這個? (非特定操作系統)


173
2017-09-15 08:32


起源


文件名不在文件中,它是如何解釋的。 - njzk2
我想起了一位在大學的朋友,他寫了一個軟件來存儲文本作為文件名以繞過磁盤配額。 - slebetman
@ColeJohnson我在2000年代在我的一個U計算機實驗室實習,用戶配額計算為文件大小的總和。因此,將數據存儲為文件名確實可以解決qouta問題。哎,你可以保存一個程序 文件夾 它不會計入您的配額。 - Mindwin
@slebetman這就是天才和精神錯亂之間界限變得模糊的地方。 - Pharap
一種類似的技術在a中被廣泛使用 壓縮挑戰, - Oddthinking


答案:


這是可能的,因為確實沒有文件。只有一個名稱和所有者的目錄條目。目錄條目在邏輯上與文件不同。例如,同一個文件可以在多個目錄中具有多個名稱。

不幸的是,術語“文件”並不總是用來表示完全相同的東西。但是文件大小邏輯來自模型,其中目錄條目將文件“附加”到目錄,文件名和相關元數據存儲在目錄中。


201
2017-09-15 08:34



...也稱為硬鏈接。 - Daniel B
在目錄中。否則,如果同一個文件位於兩個目錄中並且您將其重命名為一個目錄,則會修改另一個目錄,這根本就沒有意義。另外,如果不是這樣,目錄的內容會是什麼?! - David Schwartz
在大多數類似UNIX的操作系統(如FreeBSD和Linux)上,您可以輕鬆獲取目錄的大小。像這樣的命令 ls -ld <directory> 將工作。 - David Schwartz
我不知道當前版本的NTFS是否適用,但早期版本(例如在NT3.x上)會將非常小的文件的數據存儲在目錄條目中。該文件實際上不存在。 - John Rennie
除非NTFS與其他文件系統非常不同,否則沒有文件是不正確的。在普通的Unix文件系統上,存在一個存儲權限,模式時間等的inode。目錄條目仍引用此inode。空文件和非空文件之間的唯一區別是分配塊的指針。但是,空文件的文件系統等效於其塊映射的NULL指針,表示它沒有任何數據塊。即使對於空文件,目錄條目也不會隨著權限和修改時間而變得混亂。例如,XFS inode是256B - Peter Cordes


“文件大小”的語義含義與您使用的語義不同。

有許多文件大小是有意義的。最常見的一個,也就是你在這裡看到的那個,是“文件中的字節數”。如果文件是空文本文件,則它實際上可能包含0個字節。這個數字對於程序員來說非常重要,因為我們經常需要打開一個文件,“讀取所有數​​據”並關閉它。我們需要知道文件中有多少字節的數據,以便我們可以提前計劃。

另一個含義來自大多數文件系統存儲數據的方式。大多數文件系統以塊為單位存儲數據例如,文件系統可以以64kB塊存儲數據,這意味著它永遠不會分配任何不是64kB的偶數倍的東西。這聽起來效率低下,但它可以使記賬簡單得多,而且通常更簡單意味著更快。

你要牽著的第三個含義是硬盤驅動器上描述文件存在所需的實際位數。這包括通常與文件分開存儲的信息。例如,在Linux中,“filename”的概念存儲在包含該文件的目錄的inode中(編輯:來自註釋,從技術上講,它存儲在目錄的數據中。當我寫這篇文章時,我想的是小-directory case。小於156字節的數據可以直接存儲在inode中)。這不是一個常用的含義,因為在不了解文件系統非常深的內部工作原理的情況下確定它是非常困難的(您是否考慮了存儲文件所有權限所需的空間?)。但是,如果你有一個1,000,000字節的硬盤驅動器,並想知道文件有多大適合這個硬盤驅動器,這對你來說將是一個非常重要的意義!


82
2017-09-15 17:41



“在包含該文件的目錄的inode中” 你不是指目錄的數據,而不是它的inode? inode包含文件大小和日期,但沒有名稱...... - Medinoc
@Medinoc好點。當我將數據存儲在inode中時,我正在考慮內聯案例,但我實際上沒有檢查這可能發生多少!我添加了一個編輯。 - Cort Ammon
有關 內聯數據功能 對於ext4,這絕不是所有文件系統的通用。此外,這適用於文件inode,而不是目錄。它們是獨立的,目錄也具有內聯數據功能,但它們是獨立的功能。文件inode具有設置大小,至少在ext4的情況下,因此權限的數據使用是無關緊要的。文件磁盤的使用很大程度上取決於正在使用的文件系統,這個答案的第三部分僅適用於ext4,據我所知,這一點尚不清楚。 - Phizes
如果你有一個1,000,000字節的硬盤驅動器,可能是時候開始考慮升級了。 - nekomatic


文件名存儲在其他位置。

您的磁盤上將有一個“文件系統”,只需一種方法來選擇如何在物理磁盤上表示和解釋文件名和文件。

在大多數Windows磁盤上,您將使用名為“NTFS”(新技術文件系統“)的文件系統,它將文件名信息存儲在與文件內容分開的主文件表(MFT)中。 關於主文件表的維基百科文章

因此,文件本身的長度為0字節,但其在MFT中的條目仍將佔用一些空間。


53
2017-09-15 21:58



在NTFS的情況下,Windows和大多數工具報告的文件大小實際上是 主流 我們將文件視為文件的內容。存儲在NTFS分區上的文件可以另外存儲一些數據 替代數據流,仍然有報告的大小 0。這是一個很好的文件系統功能,知道你是否想要完整的圖片:) - Paweł Bulwan


這是一個非常有趣的本體論問題......

文件本身就是文件的內容。如果文件沒有內容,則其大小為零。文件名是文件的一部分,因為您自己的名稱實際上是您的一部分(即,它不是)。

就像你的名字作為一個想法存在於人的頭腦中(和你自己的)引用/指向物理的你,文件名存在於文件系統的目錄樹中,它引用/指向文件。


12
2017-09-16 14:59





(答案有點晚......)

文件大小為零如何比上述答案提供的要復雜一些。問題是標記為Win7,但查看其他“更簡單”的文件系統,如 脂肪 要么 NTFS,可能有用,因為概念是相似的。

磁盤不“知道”什麼是文件,什麼是目錄;它是小塊中的所有數據。 OS區分數據塊的含義。前幾個是特殊的,但其餘的塊保存有關數據的信息(例如:文件名,文件長度,保存數據的第一個數據塊)或數據本身。

目錄是一個特殊的“文件”,其操作系統理解的“數據”是一個信息塊,其中包含有關文件的信息,而不是文件的內容。一個很好的類比是物理庫和卡片目錄。將信息塊視為卡片目錄,將架子視為數據塊(卡片目錄也位於類似架子的結構上)。

當你“創建”一個文件時(比如UNIX) touch 操作系統首先在信息塊(目錄)中創建一個條目,具有以下內容:

  • Name = My_File.txt
  • 長度= 0
  • 啟動數據塊= N / A.
  • 附加信息(所有者,權限,創建/更新/修改日期)等

只有當某些數據“寫入”時,它才會嘗試找到一個空數據塊來存儲數據。但是數據塊有固定的大小(比如32K),方便磁盤到達和操作系統讀取。如果你只寫“Hello”,那麼大部分塊都是“空”(實際上可能不是零,而是來自之前的那些垃圾),所以表現在也將大小更新為長度(例如5個字符+結束文件)所以你不要得到壞東西。

當您將“文件”更新為長度>塊大小時,操作系統會將數據寫入新塊並更新數據塊,以便文件在第一個塊之後繼續到下一個塊(依此類推)並更新長度新長度(細節不同)。

您最終得到的是信息數據塊(目錄或列表)的集合,其中包含有關數據塊鏈(文件內容)的信息。

從邏輯上講,這也解釋了為什麼同一文件系統上的文件移動快速閃爍而副本需要很長時間。操作系統只需編輯2個目錄塊即可從一個目錄(信息數據塊)中刪除該條目並添加到另一個目錄塊。刪除文件:只需刪除目錄塊中的條目,釋放要重新分配的文件數據塊。

ps:只是因為卡片目錄中有一本書的入口並不意味著它在書架上(可能是簽出或丟失);文件大小0。

pps:圖書館裡面放錯地方的書意味著搜索庫,或者用計算機術語:chkdsk或修復盤!

通過閱讀UNIX inode或了解版本控制系統(ClearCase,TFS,Git等)如何管理文件和目錄,以及文件版本甚至版本的目錄,可以獲得更好的理解。在大多數情況下,所有內容都存儲在數據庫中並呈現給用戶,以顯示為經典的目錄結構和文件!


7
2017-09-16 09:55





我們在這裡有一些很好的答案 - 我只想添加圖片版本(千言萬語)。

如果您使用磁盤碎片整理工具對其進行可視化,這就是我的NTFS格式化硬盤之一。該 MFT(主文件表) 以紫羅蘭色顯示:

enter image description here

那個紫羅蘭色的小方塊描述了我的HD中存在的文件列表。粗略地說,對於NTFS磁盤,它是一本書的目錄;而不是頁面,它指向它們在磁盤其餘部分的物理位置1

可以將具有零字節大小的文件可視化為目錄條目,該條目根本不指向任何頁面:

enter image description here

列表中有條目 - 但由於沒有指示頁面,我們可以假設內容不存在。

1 - 當然,它比那復雜一點;但是像扇形圖,鏡像MFT等點的問題都超出了這個問題的範圍。


4
2017-09-24 00:05





文件系統存儲 很多 有關文件的信息,如 文件名,文件大小,創建時間,訪問時間,修改時間,創建的用戶,用戶和組權限,片段,指向存儲文件的集群的指針,硬/軟鏈接,屬性...... 那些被稱為 文件元數據。當用戶不(需要)關心它們並且不了解它們時,為什麼要將這些元數據計入文件大小?他們只關心文件內容

此外 每個文件系統都存儲不同類型的元數據 在磁盤上佔用不同的空間。例如,POSIX權限與NTFS權限非常不同,也有 inode POSIX中的數字在Windows上不存在。甚至POSIX文件系統也有很大不同,例如帶有32位塊地址的ext3,帶有48位的ext4,帶有64位的Btrfs和帶有128位地址的ZFS。那麼如何將這些元數據計入文件大小?

再舉一個100字節文件的例子,其元數據在當前文件系統上佔用56個字節。我們將文件複製到另一個文件系統,現在需要128個字節的元數據。然而 文件內容完全相同,字節數 在文件中 也是一樣的。因此,在系統上顯示文件大小為156字節,而在另一個系統上顯示228字節是非常的 令人困惑和反直覺


3
2017-09-16 09:41





文件大小為 0,類似於說:我有一張紙 5 對它的話。在另一篇論文中,它有 0 對它的話。所以 0 完全有可能。

文件的元數據(創建日期時間,上次修改日期時間,文件所有者,權限)都存儲在其他位置,而不是作為文件大小的一部分包含在內。


1
2017-12-25 04:37





以一種簡單的方式理解它......當你創建一個文件時......生成了一個目錄條目,它作為指向由你提供的文件名標識的文件的內存位置的指針。當您創建越來越多的指針或說文件時,目錄的大小會增加。而只有當您將ssome數據放在指定位置(即文件本身內)時,文件大小才會增加。直到那時大小將為零。 :)


0
2017-09-16 18:55



這真的是一個評論 - 而不是一個答案 - 只是重複其他人所說的。 - JakeGould


這就是它的工作原理:

只要在卷上創建任何文件,它就會在NTFS mata文件中創建一個文件記錄,即$ MFT(主文件表)。由於MFT中存在FRS(文件記錄段),您將看到記錄。在NTFS FileSystem的情況下,默認情況下每個文件記錄的大小為1 KB。但只有在文件中存儲了一些信息時才會聲明該空間。即使你只是寫一個字母“a”,考慮到它是一個文本文件,它將佔用1 KB的空間,因為這是FRS的默認大小。字母“a”轉到該FRS的默認和未命名數據流,$ Data是一個屬性,如果您沒有ADS(備用數據流),則所有數據都會轉到該屬性。

如果你想出任何問題,請告訴我。


0
2017-09-23 17:19