Dateilöcher sind die leeren Stellen in der Datei, die jedoch keinen Speicherplatz belegen und Nullbytes enthalten. Daher ist die Dateigröße größer als die tatsächliche Größe auf der Festplatte.
Ich weiß jedoch nicht, wie ich eine Datei mit Dateilöchern zum Experimentieren erstellen kann.
Hmmmm, ich verstehe dich hier nicht. Ein Loch ist ein Ort, an dem eine Datei nichts hat, also hat die Datei nichts, aber die Dateigröße ist größer als der Speicherplatz auf der Festplatte? Angenommen, Ihre Datei ist 100 Bytes lang, aber jedes dieser Bytes ist null (wie in binären 0), sollte es nicht 100 Bytes Speicherplatz auf der Festplatte beanspruchen?
– Zeke Hänsel
15. März 2011 um 17:21 Uhr
@Zeke: Naiv, ja. Einige Dateisysteme enthalten jedoch eine Optimierung, um eine Datei mit vielen aufeinanderfolgenden Nullbytes zu speichern und zu vermeiden, dass all diese Nullen physisch gespeichert werden. Fragen Sie mich nicht, wie die Details funktionieren, ich denke, es ist in einigen Dateiattributen vollgestopft.
– Benutzer395760
15. März 2011 um 17:23 Uhr
Meinen Sie das Gegenteil, eine Datei mit tatsächlicher Größe auf der Festplatte, die größer ist als ihre Größe (die sie hätte, wenn sie optimal gespeichert wäre)?
– ypercubeᵀᴹ
15. März 2011 um 17:24 Uhr
@Zeke Hansell: Du irrst dich. Es gibt eine Möglichkeit, eine solche Datei zu erstellen. Lesen Sie die Antworten. 🙂
– Allmächtig
15. März 2011 um 17:36 Uhr
@ Omni – Punkt genommen. Ich habe derzeit kein Unix-System vor mir. Das Beste, was mir gelingt, ist eine schlechte Imitation 😉
Das erzeugt für Sie eine Datei mit einem schönen Loch von Byte 8192 bis Byte 28671.
Hier ist ein Beispiel, das zeigt, dass die Datei tatsächlich Löcher enthält (die ls -s Befehl sagt Ihnen, wie viele Festplattenblöcke von einer Datei verwendet werden):
$ dd if=/dev/urandom bs=4096 count=2 of=fwh # fwh = file with holes
2+0 records in
2+0 records out
8192 bytes (8.2 kB) copied, 0.00195565 s, 4.2 MB/s
$ dd if=/dev/urandom seek=7 bs=4096 count=2 of=fwh
2+0 records in
2+0 records out
8192 bytes (8.2 kB) copied, 0.00152742 s, 5.4 MB/s
$ dd if=/dev/zero bs=4096 count=9 of=fwnh # fwnh = file with no holes
9+0 records in
9+0 records out
36864 bytes (37 kB) copied, 0.000510568 s, 72.2 MB/s
$ ls -ls fw*
16 -rw-rw-r-- 1 hopper hopper 36864 Mar 15 10:25 fwh
36 -rw-rw-r-- 1 hopper hopper 36864 Mar 15 10:29 fwnh
Wie Sie sehen können, nimmt die Datei mit Löchern trotz gleicher Größe weniger Festplattenblöcke ein.
Wenn Sie ein Programm suchen, das dies tut, hier ist es:
Das obige sollte auf jedem Unix funktionieren. Jemand anderes antwortete mit einer netten alternativen Methode, die sehr Linux-spezifisch ist. Ich hebe es hier hervor, weil es eine Methode ist, die sich von den beiden, die ich gegeben habe, unterscheidet und verwendet werden kann, um Löcher in vorhandene Dateien zu setzen.
Jemand hat dies abgelehnt, und ich habe keine Ahnung warum. Vielleicht hat der nicht initialisierte Speicher einen schlechten Beigeschmack hinterlassen, da es normalerweise so eine dumme Sache ist.
– Allmächtig
23. März 2013 um 1:11 Uhr
Erstellen Sie eine Datei.
Position suchen N.
Schreiben Sie einige Daten.
Es wird ein Loch am Anfang der Datei geben (bis zu und ohne position N). Sie können auf ähnliche Weise Dateien mit Löchern in der Mitte erstellen.
Danke für den Link. Es ist nicht nur für diese Frage hilfreich.
– Amumu
15. März 2011 um 17:49 Uhr
Ich habe einmal gesehen, wie ich Schritt 3 vermeiden und 100% Sparse-Dateien erstellen kann, aber ich kann mich nicht erinnern, wie es gemacht wird 🙁
– Martin Scharrer
21. Juli 2011 um 19:16 Uhr
Gefunden: Schritt 3 kann ersetzt werden durch ftruncate(fileno(outfile), ftell(outfile));dh die Datei wird nach dem auf ihre aktuelle Größe gekürzt fseek geschah. Dies ermöglicht es, das Ende der Datei spärlich zu haben.
– Martin Scharrer
21. Juli 2011 um 20:07 Uhr
Abgesehen davon, dass Sie Dateien mit Löchern erstellen können, können Sie seit ~2 Monaten (Mitte Januar 2011) Löcher in bestehende Dateien unter Linux stanzen, indem Sie verwenden fallocate(2)FALLOC_FL_PUNCH_HOLELWN-Artikel, git commit auf Linus’ Baum, Patch auf die Manpages von Linux.
Das Problem wird ausführlich in Abschnitt 3.6 von W.Richard Stevens berühmtem Buch „Advanced Programming in the UNIX Environment“ (kurz APUE) diskutiert. Hier wird die in unistd.h enthaltene lseek-Funktion verwendet, die dazu dient, den Offset einer geöffneten Datei explizit zu setzen. Der Prototyp der lseek-Funktion sieht wie folgt aus:
off_t lseek(int filedes, off_t offset, int whence);
Hier ist filedes der Dateideskriptor, offset ist der Wert, den wir setzen möchten, und wherece ist eine Konstante, die in der Header-Datei festgelegt ist, insbesondere SEEK_SET, was bedeutet, dass der Offset vom Anfang der Datei an gesetzt wird; SEEK_CUR, was bedeutet, dass der Offset auf seinen aktuellen Wert plus den Offset in der Argumentliste gesetzt wird; SEEK_END, was bedeutet, dass der Offset der Datei auf die Größe der Datei plus den Offset in der Argumentliste gesetzt wird.
Das Beispiel zum Erstellen einer Datei mit Löchern in C unter UNIX-ähnlichen Betriebssystemen lautet wie folgt:
/*Creating a file with a hole of size 810*/
#include <fcntl.h>
/*Two strings to write to the file*/
char buf1[] = "abcde";
char buf2[] = "ABCDE";
int main()
{
int fd; /*file descriptor*/
if((fd = creat("file_with_hole", FILE_MODE)) < 0)
err_sys("creat error");
if(write(fd, buf1, 5) != 5)
err_sys("buf1 write error");
/*offset now 5*/
if(lseek(fd, 815, SEEK_SET) == -1)
err_sys("lseek error");
/*offset now 815*/
if(write(fd, buf2, 5) !=5)
err_sys("buf2 write error");
/*offset now 820*/
return 0;
}
Im obigen Code ist err_sys die Funktion zur Behandlung schwerwiegender Fehler im Zusammenhang mit einem Systemaufruf.
Ein Loch entsteht, wenn Daten mit einem Offset geschrieben werden, der über die aktuelle Dateigröße hinausgeht, oder wenn die Dateigröße auf etwas größer als die aktuelle Dateigröße gekürzt wird
So wie es derzeit geschrieben steht, ist Ihre Antwort unklar. Bitte bearbeiten Sie, um zusätzliche Details hinzuzufügen, die anderen helfen zu verstehen, wie dies die gestellte Frage beantwortet. Weitere Informationen zum Verfassen guter Antworten finden Sie in der Hilfe.
– Gemeinschaft bot
24. November 2021 um 8:21 Uhr
So wie es derzeit geschrieben steht, ist Ihre Antwort unklar. Bitte bearbeiten Sie, um zusätzliche Details hinzuzufügen, die anderen helfen zu verstehen, wie dies die gestellte Frage beantwortet. Weitere Informationen zum Verfassen guter Antworten finden Sie in der Hilfe.
– Gemeinschaft bot
24. November 2021 um 8:21 Uhr
13108900cookie-checkWie erstelle ich eine Datei mit Dateilöchern?yes
Hmmmm, ich verstehe dich hier nicht. Ein Loch ist ein Ort, an dem eine Datei nichts hat, also hat die Datei nichts, aber die Dateigröße ist größer als der Speicherplatz auf der Festplatte? Angenommen, Ihre Datei ist 100 Bytes lang, aber jedes dieser Bytes ist null (wie in binären 0), sollte es nicht 100 Bytes Speicherplatz auf der Festplatte beanspruchen?
– Zeke Hänsel
15. März 2011 um 17:21 Uhr
@Zeke: Naiv, ja. Einige Dateisysteme enthalten jedoch eine Optimierung, um eine Datei mit vielen aufeinanderfolgenden Nullbytes zu speichern und zu vermeiden, dass all diese Nullen physisch gespeichert werden. Fragen Sie mich nicht, wie die Details funktionieren, ich denke, es ist in einigen Dateiattributen vollgestopft.
– Benutzer395760
15. März 2011 um 17:23 Uhr
Meinen Sie das Gegenteil, eine Datei mit tatsächlicher Größe auf der Festplatte, die größer ist als ihre Größe (die sie hätte, wenn sie optimal gespeichert wäre)?
– ypercubeᵀᴹ
15. März 2011 um 17:24 Uhr
@Zeke Hansell: Du irrst dich. Es gibt eine Möglichkeit, eine solche Datei zu erstellen. Lesen Sie die Antworten. 🙂
– Allmächtig
15. März 2011 um 17:36 Uhr
@ Omni – Punkt genommen. Ich habe derzeit kein Unix-System vor mir. Das Beste, was mir gelingt, ist eine schlechte Imitation 😉
– Zeke Hänsel
15. März 2011 um 17:57 Uhr