Wie kann eine Dateigröße Null sein?

173

Nur etwas, auf das ich gestoßen bin und mir keine richtige Erklärung einfallen ließ. Wenn ich eine leere * .txt-Datei auf meinem PC erstelle und dann ihre Größe betrachte, wird 0 angezeigt. Aber wie ist das möglich? Ich meine, auch wenn die Datei selbst leer ist, muss sie eine gewisse Größe haben, nur um ihren eigenen Namen zu speichern. Wie ist das zu erklären? (Betriebssystemunabhängig)

Eugene S
quelle
81
Der Dateiname zählt nicht in die Datei, so wie es erklärt werden kann.
njzk2
123
Ich erinnere mich an einen College-Freund, der eine Software geschrieben hat, die Text als Dateinamen speichert, um das Festplattenkontingent zu umgehen.
Slebetman
15
@ColeJohnson Ich war ein Praktikant in den 2000er Jahren in einem der Computerlabors meines U und die Benutzerquote wurde als Summe der Dateigrößen berechnet. Das Speichern von Daten als Dateinamen würde sich also in der Tat in qouta herumsprechen. Zum Teufel, Sie könnten ein Programm in Ordnern speichern und es würde nicht auf Ihr Kontingent angerechnet.
Mindwin
20
@slebetman Dies ist der Punkt, an dem die Grenze zwischen Genie und Wahnsinn verschwimmt.
Pharap
10
Eine ähnliche Technik wurde berühmt in einer gebrauchten Druck Herausforderung ,
Oddthinking

Antworten:

202

Es ist möglich, weil es wirklich keine Datei gibt. Es gibt nur einen Verzeichniseintrag mit einem Namen und einem Besitzer. Der Verzeichniseintrag unterscheidet sich logisch von der Datei. Beispielsweise kann dieselbe Datei mehr als einen Namen in mehr als einem Verzeichnis haben.

Leider bedeutet der Begriff "Datei" nicht immer genau dasselbe. Die Dateigrößenlogik stammt jedoch von dem Modell, bei dem ein Verzeichniseintrag eine Datei an ein Verzeichnis "anfügt" und Dateinamen und zugehörige Metadaten im Verzeichnis gespeichert werden.

David Schwartz
quelle
30
... auch bekannt als Hard Links.
Daniel B
6
Im Verzeichnis. Andernfalls würde, wenn sich dieselbe Datei in zwei Verzeichnissen befindet und Sie sie in einem umbenennen, das andere Verzeichnis geändert, was überhaupt keinen Sinn ergibt. Wäre es nicht so, wie würde der Inhalt eines Verzeichnisses aussehen ?!
David Schwartz
14
Auf den meisten UNIX-ähnlichen Betriebssystemen wie FreeBSD und Linux können Sie problemlos die Größe eines Verzeichnisses abrufen. Befehle wie ls -ld <directory>funktionieren.
David Schwartz
11
Ich weiß nicht, ob dies für die aktuelle Version von NTFS zutrifft, aber frühe Versionen (z. B. auf NT3.x) würden die Daten für sehr kleine Dateien im Verzeichniseintrag speichern. Die Datei würde buchstäblich nicht existieren.
John Rennie
13
Es ist nicht ganz richtig, dass es keine Datei gibt, es sei denn, NTFS unterscheidet sich sehr von anderen Dateisystemen. Auf einem normalen Unix-Dateisystem würde es einen Inode geben, der die Berechtigungen, Mod-Zeiten usw. speichert. Der Verzeichniseintrag verweist weiterhin auf diesen Inode. Der einzige Unterschied zwischen einer leeren und einer nicht leeren Datei besteht in der Zuweisung von Blöcken. Eine leere Datei hat das Dateisystemäquivalent eines NULL-Zeigers für ihre Blockzuordnung, um anzuzeigen, dass sie keine Datenblöcke enthält. Verzeichniseinträge sind nicht mit Berechtigungen und Änderungszeiten überfüllt, auch nicht für leere Dateien. zB XFS-Inodes sind 256B
Peter Cordes
82

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

Es gibt viele sinnvolle Dateigrößen. Die gebräuchlichste 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 Nummer ist für Programmierer wichtig, da wir häufig eine Datei öffnen, "alle Daten lesen" und schließen müssen. Wir müssen wissen, wie viele Datenbytes in der Datei enthalten sind, damit wir vorausplanen können.

Eine andere 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 aber die Buchhaltung erheblich vereinfachen und oft einfacher, dh schneller.

Eine dritte Bedeutung, an der Sie zerren, ist die tatsächliche Anzahl von Bits, die auf der Festplatte erforderlich sind, um das Vorhandensein einer Datei zu beschreiben. Dies schließt Informationen ein, die normalerweise getrennt von der Datei gespeichert werden. Unter Linux wird beispielsweise das Konzept des "Dateinamens" im Inode des Verzeichnisses gespeichert, in dem sich die Datei befindet (Bearbeiten: aus Kommentaren, technisch gesehen wird dies in den Daten des Verzeichnisses gespeichert. Als ich dies schrieb, dachte ich an das Kleine -directory case: Daten, die kleiner als 156 Byte sind, können direkt im Inode gespeichert werden. Dies ist keine allgemein gebräuchliche Bedeutung, da es fürchterlich schwierig ist, dies zu bestimmen, ohne die tiefgreifende Funktionsweise Ihres Dateisystems 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-Festplatte haben,

Cort Ammon
quelle
2
"im inode für das verzeichnis mit der datei" Meinen Sie nicht die daten des verzeichnisses und nicht den inode? Die Inode enthält Dateigrößen und Daten, aber keine Namen ...
Medinoc
@ Medinoc Guter Punkt. Ich habe an den Inline-Fall gedacht, in dem die Daten im Inode gespeichert wurden, aber ich habe nicht überprüft, inwieweit dies auftreten kann! Ich habe eine Bearbeitung hinzugefügt.
Cort Ammon
Die verwandte Inline-Datenfunktion von ext4 ist keineswegs für alle Dateisysteme universell. Dies gilt auch für die Dateien inode, nicht das Verzeichnis. Sie sind getrennt, Verzeichnisse haben auch eine Inline-Datenfunktion, sie sind jedoch getrennte Funktionen. Ein Datei-Inode hat zumindest im Fall von ext4 eine festgelegte Größe, sodass die Datennutzung von Berechtigungen keine Rolle spielt. Die Datenträgerverwendung von Dateien hängt stark vom verwendeten Dateisystem ab. Der dritte Teil dieser Antwort gilt nur für ext4, soweit ich das beurteilen kann. Dies wird nicht klargestellt.
Phizes
8
Wenn Sie eine 1.000.000-Byte-Festplatte haben, ist es möglicherweise an der Zeit, über ein Upgrade nachzudenken.
Nekomatic
53

Der Dateiname wird an einer anderen Stelle gespeichert.

Auf Ihrer Festplatte befindet sich ein "Dateisystem", also eine Methode zur Auswahl, wie Dateinamen und Dateien auf der physischen Festplatte dargestellt und interpretiert werden.

Auf den meisten Windows - Disketten finden Sie das ein Dateisystem namens "NTFS" (New Technology File System "), diese speichert Dateinamen Informationen in der Master File Table (MFT) getrennt von dem Inhalt der Datei. Siehe verwenden Wikipedia - Artikel über Master File Table .

Die Datei selbst hat daher eine Länge von 0 Byte, ihr Eintrag in der MFT belegt jedoch noch etwas Platz.

Matthew1471
quelle
11
Im Falle von NTFS entspricht die von Windows und den meisten Tools gemeldete Dateigröße der Größe des Hauptstreams der Datei, den wir als Inhalt der Datei betrachten. In der auf der NTFS-Partition gespeicherten Datei können außerdem einige Daten in alternativen Datenströmen gespeichert sein und die angegebene Größe von 0 beibehalten . Es ist eine nette Dateisystemfunktion, um zu wissen, ob Sie das vollständige Bild haben möchten :)
Paweł Bulwan
12

Dies ist eine interessante ontologische Frage ...

Die Datei selbst ist der Inhalt der Datei. Wenn die Datei keinen Inhalt hat, hat sie eine Größe von Null. Der Dateiname ist genauso ein Teil der Datei wie Ihr eigener Name ein Teil von Ihnen (dh er ist nicht Teil von Ihnen).

So wie Ihr Name als eine Idee in den Köpfen der Menschen (und Ihrer eigenen) existiert, die auf Ihr physisches Ich verweist / verweist, existiert der Dateiname im Verzeichnisbaum des Dateisystems und verweist / verweist auf die Datei.

Luke
quelle
7

(Ein bisschen zu spät zur 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 der Blick auf andere "einfachere" Dateisysteme wie FAT oder NTFS kann nützlich sein, da die Konzepte ähnlich sind.

Die Festplatte "weiß" nicht, was eine Datei und was ein Verzeichnis ist. Es sind alles Daten in kleinen Blöcken. Das Betriebssystem unterscheidet zwischen der Bedeutung von Datenbausteinen. Die ersten paar a special, aber der Rest der Blöcke enthält entweder Informationen zu den 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 den Kartenkatalog und die Regale als die Datenblöcke vor (der Kartenkatalog befindet sich ebenfalls auf einer regalartigen Struktur).

Wenn Sie eine Datei "erstellen" (z. B. mit dem UNIX- touchBefehl), erstellt das Betriebssystem zunächst einen Eintrag in einem Informationsblock (Verzeichnis) mit den folgenden Angaben:

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

Nur wenn Daten zu "schreiben" sind, wird versucht, einen leeren Datenblock zum Speichern der Daten zu finden. Die Datenblöcke sind jedoch in festen Größen (z. B. 32 KB) verfügbar, auf die die Festplatte zugreifen und das Betriebssystem lesen kann. Wenn Sie nur "Hallo" schreiben, ist der größte Teil des Blocks "leer" (tatsächlich dürfen es keine Nullen sein, sondern Müll von dem, was vorher da war), so dass die Tabelle jetzt auch die Größe auf die Länge aktualisiert (sagen wir 5 Zeichen + Ende von Datei), damit Sie nicht die schlechten Sachen 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 mitzuteilen, dass die Datei nach dem ersten (und so weiter) im nächsten Block fortgesetzt wird, und die Länge wird aktualisiert neue Länge (Details abweichen).

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

Dies erklärt logischerweise auch, warum eine Datei, die sich auf demselben Dateisystem befindet, schnell blinkt, während eine Kopie lange dauert. Das Betriebssystem muss nur 2 Verzeichnisblöcke bearbeiten, um den Eintrag aus einem Verzeichnis (Informationsdatenblock) zu entfernen und zu einem anderen hinzuzufügen. Datei löschen: Entfernen Sie einfach den Eintrag im Verzeichnisblock, um die neu zuzuordnenden Dateidatenblöcke freizugeben.

ps: Nur weil der Kartenkatalog einen Eintrag für ein Buch enthält, heißt das nicht, dass er im Regal steht (ausgecheckt oder vielleicht verloren). Dateigröße 0.

pps: Ein verlegtes Buch in der Bibliothek impliziert die Suche in der Bibliothek oder in Bezug auf den Computer: chkdsk oder repair disk!

Zum besseren Verständnis lesen Sie etwas über UNIX-Inodes oder erfahren, wie Versionskontrollsysteme (ClearCase, TFS, Git usw.) nicht nur Dateien und Verzeichnisse, sondern auch Versionen von Dateien und sogar Versionen von Verzeichnissen verwalten. In den meisten Fällen wird alles in einer Datenbank gespeichert und dem Benutzer als klassische Verzeichnisstruktur und Dateien angezeigt!

Ian W
quelle
4

Wir haben hier einige ausgezeichnete Antworten - ich möchte nur die Bildversion hinzufügen (tausend Wörter und all das.)

So sieht eine meiner NTFS-formatierten Festplatten aus, wenn Sie sie mit einem Defragmentierungsprogramm visualisieren. Die MFT (Master File Table) wird in Violett angezeigt:

Bildbeschreibung hier eingeben

Dieses kleine violette Quadrat beschreibt die Liste der Dateien in meiner HD. In groben Zügen ist es für eine NTFS-Festplatte das Inhaltsverzeichnis für ein Buch; Anstelle von Seiten wird auf den physischen Speicherort auf der restlichen Festplatte 1 verwiesen .

Eine Datei mit einer Größe von null Byte kann als Inhaltsverzeichniseintrag dargestellt werden, der auf keine Seite verweist:

Bildbeschreibung hier eingeben

Der Eintrag ist dort aufgelistet - aber da keine Seite angegeben ist, können wir davon ausgehen, dass der Inhalt nicht vorhanden ist.

1 - Sicher ist es ein bisschen komplizierter als das; Punkte wie Sektorkarten, Spiegel-MFTs usw. fallen jedoch nicht in den Geltungsbereich dieser Frage.

OnoSendai
quelle
3

Dateisysteme speichern viele Informationen zu einer Datei, z. B. Dateiname, Dateigröße, Erstellungszeit, Zugriffszeit, Änderungszeit, Berechtigungen für erstellte Benutzer, Benutzer und Gruppen, Fragmente, Zeiger auf Cluster, in denen die Datei gespeichert ist, Hard / Soft-Links, Attribute ... Diese werden als Dateimetadaten bezeichnet . Warum zählen Sie diese Metadaten zur Dateigröße, wenn sich Benutzer nicht um sie kümmern (müssen) und sie nicht kennen? Sie kümmern sich nur wirklich um den Dateiinhalt

Darüber hinaus speichert jedes Dateisystem verschiedene Arten von Metadaten , die unterschiedlich viel Speicherplatz auf der Festplatte beanspruchen. Beispielsweise unterscheiden sich POSIX-Berechtigungen stark von NTFS-Berechtigungen, und es gibt auch inodeZahlen in POSIX, die unter Windows nicht vorhanden sind. Selbst POSIX-Dateisysteme sind sehr unterschiedlich, wie ext3 mit 32-Bit-Blockadresse, ext4 mit 48-Bit, Btrfs mit 64-Bit und ZFS mit 128-Bit-Adresse. Wie werden diese Metadaten in die Dateigröße gezählt?

Nehmen Sie ein anderes Beispiel mit einer 100-Byte-Datei, deren Metadaten 56 Byte im aktuellen Dateisystem belegen. Wir kopieren die Datei in ein anderes Dateisystem und jetzt werden 128 Byte Metadaten benötigt. Der Dateiinhalt ist jedoch genau gleich , die Anzahl der Bytes in den Dateien ist ebenfalls gleich. Die Anzeige der Dateigröße auf einem System als 156 Byte, auf einem anderen als 228 Byte ist also sehr verwirrend und nicht intuitiv .

phuclv
quelle
1

Eine Dateigröße von 0, ähnelt dem Sprichwort: Ich habe ein Papier mit 5Wörtern darauf. Und auf einem anderen Blatt stehen 0Worte drauf. So 0ist das durchaus möglich.

Die Metadaten der Datei (Erstellungsdatum, Datum der letzten Änderung, Dateibesitzer, Berechtigungen) werden alle dort gespeichert, wo sie nicht Teil der Dateigröße sind.

Nopole
quelle
0

Verstehen Sie es auf einfache Weise ... Wenn Sie eine Datei erstellen ... wird ein Verzeichniseintrag generiert, der als Zeiger auf den Speicherort der Datei dient, der durch den von Ihnen angegebenen Dateinamen identifiziert wird. Die Größe des Verzeichnisses nimmt zu, wenn Sie mehr und mehr Zeiger erstellen oder Dateien sagen. Die Dateigröße nimmt jedoch nur zu, wenn Sie einige Daten an der gewünschten Stelle, dh in der Datei selbst, ablegen. Bis dahin ist die Größe Null. :)

Vikash Mishra
quelle
Dies ist wirklich ein Kommentar - keine Antwort - und wiederholt nur, was andere gesagt haben.
JakeGould
0

So funktioniert es:

Sobald Sie eine Datei auf einem Volume erstellen, wird ein Dateidatensatz in der NTFS-Mata-Datei erstellt, z. B. $ MFT (Master-Dateitabelle). Da in der MFT ein FRS (File Record Segment) vorhanden ist, wird ein Datensatz angezeigt. Jeder Dateidatensatz hat bei NTFS FileSystem standardmäßig eine Größe von 1 KB. Dieser Speicherplatz wird jedoch nur beansprucht, wenn Sie einige Informationen in der Datei speichern. Auch wenn Sie nur einen einzelnen Buchstaben "a" schreiben, da es sich um eine Textdatei handelt, beansprucht sie 1 KB Speicherplatz, da dies die Standardgröße des FRS ist. Der Buchstabe "a" geht an den standardmäßigen und unbenannten Datenstrom dieses FRS, $ Data, bei dem es sich um ein Attribut handelt, in das alle Ihre Daten geschrieben werden, wenn Sie keinen ADS (Alternate Data Stream) haben.

Lassen Sie mich wissen, wenn Sie Fragen haben.

Sdf
quelle