Wie kann eine Dateigröße Null sein?

Wie kann eine Dateigröße Null sein?

Ich bin gerade auf etwas gestoßen, wofür mir keine richtige Erklärung eingefallen ist. Wenn ich auf meinem PC eine leere *.txt-Datei erstelle und mir dann ihre Größe anschaue, wird 0 angezeigt. Aber wie ist das möglich? Ich meine, selbst wenn die Datei selbst leer ist, muss sie trotzdem eine gewisse Größe haben, nur um ihren eigenen Namen zu speichern. Wie lässt sich das erklären? (Nicht betriebssystemspezifisch)

Antwort1

Dies ist möglich, weil es in Wirklichkeit keine Datei gibt. Es gibt nur einen Verzeichniseintrag mit einem Namen und einem Eigentümer. Der Verzeichniseintrag unterscheidet sich logisch von der Datei. Beispielsweise kann dieselbe Datei in mehreren Verzeichnissen mehrere Namen haben.

Leider wird der Begriff „Datei“ nicht immer genau für dasselbe verwendet. Die Logik der Dateigröße beruht jedoch auf dem Modell, bei dem ein Verzeichniseintrag eine Datei an ein Verzeichnis „anfügt“ und Dateinamen und zugehörige Metadaten im Verzeichnis gespeichert werden.

Antwort2

Die semantische Bedeutung von „Dateigröße“ unterscheidet sich von der von Ihnen verwendeten.

Es gibt viele Dateigrößen, die sinnvoll sind. Die häufigste, und die, die Sie hier sehen, ist „die Anzahl der Bytes in der Datei“. Wenn die Datei eine leere Textdatei ist, kann sie tatsächlich 0 Bytes enthalten. Diese Zahl ist für Programmierer wichtig, da wir häufig eine Datei öffnen, „alle Daten lesen“ und sie wieder schließen müssen. Wir müssen wissen, wie viele Datenbytes in der Datei sein werden, damit wir vorausplanen können.

Eine weitere Bedeutung ergibt sich aus der Art und Weise, wie die meisten Dateisysteme Daten speichern. Die meisten Dateisysteme speichern Daten in Blöcken. Beispielsweise kann das Dateisystem Daten in 64-kB-Blöcken speichern, was bedeutet, dass es niemals etwas zuweist, das kein gerades Vielfaches von 64 kB ist. Das klingt ineffizient, kann die Buchführung jedoch erheblich vereinfachen, und oft bedeutet einfacher auch schneller.

Eine dritte Bedeutung, die Sie ansprechen, wäre die tatsächliche Anzahl der Bits, die auf der Festplatte erforderlich sind, um das Vorhandensein einer Datei zu beschreiben. Dazu gehören Informationen, die normalerweise getrennt von der Datei gespeichert werden. Unter Linux wird beispielsweise das Konzept des „Dateinamens“ im Inode für das Verzeichnis gespeichert, das die Datei enthält (Bearbeiten: Aus den Kommentaren geht hervor, dass dies technisch gesehen in den Daten des Verzeichnisses gespeichert wird. Als ich dies schrieb, dachte ich an den Fall kleiner Verzeichnisse. Daten, die kleiner als 156 Byte sind, können direkt im Inode gespeichert werden). Dies ist keine allgemein verwendete Bedeutung, da sie furchtbar schwer zu bestimmen ist, ohne die Funktionsweise Ihres Dateisystems sehr genau zu kennen (haben Sie den Speicherplatz berücksichtigt, der zum Speichern aller Berechtigungen für die Datei erforderlich ist?). Wenn Sie jedoch eine 1.000.000 Byte große Festplatte haben und wissen möchten, wie groß eine Datei sein muss, die auf diese Festplatte passt, ist dies eine sehr wichtige Bedeutung für Sie!

Antwort3

Der Dateiname wird woanders gespeichert.

Auf Ihrer Festplatte befindet sich ein „Dateisystem“, d. h., vereinfacht ausgedrückt, eine Methode zur Auswahl, wie Dateinamen und Dateien auf der physischen Festplatte dargestellt und interpretiert werden.

Auf den meisten Windows-Festplatten wird ein Dateisystem namens „NTFS“ (New Technology File System) verwendet. Dieses speichert Dateinameninformationen in der Master File Table (MFT) getrennt vom Dateiinhalt. Weitere Informationen finden Sie in derWikipedia-Artikel zur Master File Table.

Die Datei selbst hat daher eine Länge von 0 Bytes, ihr Eintrag in der MFT nimmt jedoch dennoch etwas Speicherplatz ein.

Antwort4

(Etwas spät mit der Antwort...)

Wie eine Datei die Größe Null haben kann, ist etwas komplizierter als in den obigen Antworten angegeben. Die Frage ist mit Win7 gekennzeichnet, aber wenn man sich andere "einfachere" Dateisysteme ansieht, wieFETToderNTFS, kann nützlich sein, da die Konzepte ähnlich sind.

Die Festplatte „weiß“ nicht, was eine Datei und was ein Verzeichnis ist; alle Daten sind in kleinen Blöcken. Das Betriebssystem unterscheidet zwischen der Bedeutung von Datenblöcken. Die ersten paar sind speziell, aber der Rest der Blöcke enthält entweder Informationen über die Daten (z. B. Dateiname, Dateilänge, erster Datenblock, der die Daten enthält) oder die Daten selbst.

Ein Verzeichnis ist eine spezielle „Datei“, deren „Daten“ das Betriebssystem als Informationsblock versteht, der Informationen über Dateien enthält, nicht den Inhalt der Dateien. Eine gute Analogie ist eine physische Bibliothek und der Kartenkatalog. Stellen Sie sich die Informationsblöcke als Kartenkatalog und die Regale als Datenblöcke vor (der Kartenkatalog befindet sich ebenfalls auf einer regalähnlichen Struktur).

Wenn Sie eine Datei „erstellen“ (beispielsweise mit einem UNIX- touchBefehl), erstellt das Betriebssystem zunächst einen Eintrag in einem Informationsblock (Verzeichnis) mit folgendem Inhalt:

  • Name = Meine_Datei.txt
  • Länge = 0
  • Datenblock starten = N/A
  • Zusätzliche Informationen (Eigentümer, Berechtigungen, Erstellungs-/Aktualisierungs-/Änderungsdatum) usw.

Nur wenn Daten zum „Schreiben“ vorhanden sind, wird versucht, einen leeren Datenblock zum Speichern der Daten zu finden. Die Datenblöcke haben jedoch feste Größen (z. B. 32 KB), die für die Festplatte leicht zugänglich und für das Betriebssystem leicht zu lesen sind. Wenn Sie nur „Hallo“ schreiben, ist der größte Teil des Blocks „leer“ (tatsächlich sind es möglicherweise keine Nullen, sondern Müll von dem, was vorher da war), sodass die Tabelle jetzt auch die Größe auf die Länge aktualisiert (z. B. 5 Zeichen + Dateiende), damit Sie nicht das schlechte Zeug bekommen.

Wenn Sie die „Datei“ auf eine Länge > Blockgröße aktualisieren, schreibt das Betriebssystem die Daten in den neuen Block und aktualisiert einen Datenblock, um anzugeben, dass die Datei mit dem nächsten Block NACH dem ersten (und so weiter) fortgesetzt wird und die Länge auf die neue Länge aktualisiert wird (Details variieren).

Am Ende erhalten Sie eine Sammlung von Informationsdatenblöcken (Verzeichnisse oder Listen) mit Informationen zu den Datenblockketten (Dateiinhalte).

Logischerweise erklärt dies auch, warum das Verschieben einer Datei im selben Dateisystem schnell abläuft, während das Kopieren lange dauert. Das Betriebssystem muss nur zwei Verzeichnisblöcke bearbeiten, um den Eintrag aus einem Verzeichnis (Informationsdatenblock) zu entfernen und einem anderen hinzuzufügen. Löschen einer Datei: Entfernen Sie einfach den Eintrag im Verzeichnisblock, um die Dateidatenblöcke für die Neuzuweisung freizugeben.

PS: Nur weil ein Buch im Zettelkatalog verzeichnet ist, heißt das nicht, dass es im Regal steht (vielleicht ausgeliehen oder verloren gegangen ist); Dateigröße 0.

pps: Ein verlegtes Buch in der Bibliothek impliziert eine Bibliothekssuche oder in der Computersprache: chkdsk oder Datenträger reparieren!

Ein besseres Verständnis kann man erlangen, indem man über UNIX-Inodes liest oder sich damit befasst, wie Versionskontrollsysteme (ClearCase, TFS, Git usw.) nicht nur Dateien und Verzeichnisse, sondern auch Dateiversionen und sogar Verzeichnisversionen verwalten. In den meisten Fällen wird alles in einer Datenbank gespeichert und dem Benutzer als klassische Verzeichnisstruktur und Dateien präsentiert!

verwandte Informationen