只是我遇到了一些事情,但無法想出正確的解釋。如果我在我的電腦上建立一個空的 *.txt 文件,然後查看其大小,它會顯示 0。我的意思是,即使檔案本身是空的,它仍然必須有一定的大小,只是為了儲存它自己的名稱。這該如何解釋呢? (與作業系統無關)
答案1
這是可能的,因為確實沒有文件。只有一個帶有名稱和所有者的目錄條目。目錄項在邏輯上與檔案不同。例如,同一檔案在多個目錄中可以有多個名稱。
不幸的是,術語“文件”並不總是用來表示完全相同的事物。但檔案大小邏輯來自目錄條目將檔案「附加」到目錄並且檔案名稱和相關元資料儲存在目錄中的模型。
答案2
“文件大小”的語義與您使用的不同。
有許多有意義的檔案大小。最常見的,也是您在這裡看到的,是「檔案中的位元組數」。如果文件是空文本文件,則它可能確實包含 0 位元組。這個數字對於程式設計師來說很重要,因為我們經常需要打開一個文件,“讀取所有資料”,然後關閉它。我們需要知道文件中有多少位元組的數據,以便我們可以提前規劃。
另一個含義來自大多數檔案系統儲存資料的方式。大多數檔案系統將資料儲存在區塊中。例如,檔案系統可能將資料儲存在 64kB 區塊中,這意味著它永遠不會分配任何不是 64kB 偶數倍的資料。這聽起來效率很低,但它可以使簿記變得更加簡單,而且通常更簡單意味著更快。
您正在討論的第三個含義是硬碟上描述檔案存在所需的實際位數。這包括通常與文件分開儲存的資訊。例如,在Linux中,「檔案名稱」的概念儲存在包含該檔案的目錄的inode中(編輯:來自註釋,從技術上講,它儲存在目錄的資料中。當我寫這篇文章時,我想到了小-目錄情況。這不是常用的含義,因為如果您不了解檔案系統的非常深入的內部工作原理,就很難確定(您是否考慮了儲存檔案上所有權限所需的空間?)。但是,如果您有一個 1,000,000 位元組的硬碟,並且想知道該硬碟上可以容納多大的文件,這對您來說將具有非常重要的意義!
答案3
檔案名稱儲存在其他地方。
您的磁碟上將有一個“檔案系統”,簡單地說是選擇如何在實體磁碟上表示和解釋檔案名稱和檔案的方法。
在大多數 Windows 磁碟上,您將使用名為「NTFS」(新技術檔案系統)的檔案系統,該系統將檔案名稱資訊與檔案內容分開儲存在主檔案表 (MFT) 中。維基百科關於主文件表的文章。
因此,檔案本身的長度為 0 位元組,但其在 MFT 中的條目仍將佔用一些空間。
答案4
(回答有點晚了……)
文件大小如何為零比上述答案提供的要複雜一些。問題被標記為Win7,但看看其他「更簡單」的檔案系統,例如胖的或者NTFS,可能有用,因為概念相似。
磁碟不「知道」什麼是文件,什麼是目錄;所有數據都在小塊中。作業系統區分資料塊的意義。前幾個區塊比較特殊,但其餘區塊則保存有關資料的資訊(例如:檔案名稱、檔案長度、保存資料的第一個資料區塊)或資料本身。
目錄是一種特殊的“檔案”,作業系統理解的“資料”是包含檔案資訊的資訊區塊,而不是檔案的內容。一個很好的類比是實體圖書館和卡片目錄。將資訊塊視為卡片目錄,將架子視為資料塊(卡片目錄也位於類似架子的結構上)。
當您「建立」檔案(例如使用 UNIXtouch
命令)時,作業系統會先在資訊區塊(目錄)中建立一個項目,其中包含以下內容:
- 名稱 = My_File.txt
- 長度 = 0
- 起始資料區塊 = N/A
- 附加資訊(所有者、權限、建立/更新/修改日期)等
只有當有一些資料要「寫入」時,它才會嘗試尋找空資料塊來儲存資料。但資料區塊具有固定大小(例如 32K),方便磁碟存取和作業系統讀取。如果您只寫“Hello”,則大部分區塊都是“空”(實際上可能不是零,而是之前的垃圾),因此該表現在還將大小更新為長度(例如 5 個字元 + 的結尾)文件)這樣你就不會得到壞的東西。
當您將「檔案」更新為長度>區塊大小時,作業系統將資料寫入新區塊並更新資料區塊,表示檔案在第一個區塊(依此類推)之後繼續到下一個區塊,長度更新為新長度(細節不同)。
您最終得到的是資訊資料塊(目錄或清單)的集合,其中包含有關資料塊鏈(檔案內容)的資訊。
從邏輯上講,這也解釋了為什麼同一檔案系統上的檔案移動速度很快,而副本則需要很長時間。作業系統只需編輯 2 個目錄區塊即可從一個目錄(資訊資料區塊)中刪除條目並新增到另一個目錄中。刪除檔案:只需刪除目錄區塊中的項目,釋放檔案資料區塊即可重新指派。
PS:僅僅因為卡片目錄中有一本書的條目並不意味著它已被放在書架上(可能已簽出或丟失);文件大小0。
pps:圖書館內放錯地方的書意味著搜尋圖書館,或用電腦術語來說:chkdsk 或修復磁碟!
透過閱讀 UNIX inode 或了解版本控制系統(ClearCase、TFS、Git 等)如何不僅管理檔案和目錄,還管理檔案版本甚至目錄版本,可以更好地理解。在大多數情況下,所有內容都儲存在資料庫中並以經典目錄結構和檔案的形式呈現給使用者!