Ich möchte eine Sparse-Datei erstellen, bei der Blöcke, die nur aus Nullen bestehen, nicht den tatsächlichen Speicherplatz einnehmen, bis ich Daten auf sie schreibe. Ist es möglich?
Wie bei anderen Unixen ist es eine Eigenschaft des Dateisystems. Entweder das Dateisystem unterstützt es für ALLE Dateien oder nicht. Im Gegensatz zu Win32 müssen Sie nichts Besonderes tun, um dies zu ermöglichen. Im Gegensatz zu Win32 gibt es keine Leistungseinbußen für die Verwendung einer Sparse-Datei.
Unter MacOS ist das Standard-Dateisystem HFS +, das nicht Dateien mit geringer Dichte unterstützt.
Update: MacOS, das zur Unterstützung von UFS-Volumes mit Sparse-Dateiunterstützung verwendet wurde, wurde jedoch entfernt. Keines der derzeit unterstützten Dateisysteme unterstützt die Unterstützung seltener Dateien.
Es scheint einige Verwirrung darüber zu bestehen, ob das Standard-Mac OS X-Dateisystem (HFS +) Löcher in Dateien unterstützt. Das folgende Programm zeigt, dass dies nicht der Fall ist.
%Vor%Das Programm erstellt zwei Dateien mit einer Länge von jeweils 100.000 Byte, von denen eine eine Leerstelle von 99.988 Byte enthält.
Unter Mac OS X 10.5 auf einer HFS + -Partition nehmen beide Dateien die gleiche Anzahl von Festplattenblöcken (200) auf:
%Vor%Während auf CentOS 5 die Datei ohne Löcher mehr 88 Festplattenblöcke benötigt als die andere:
%Vor%Dieser Thread wird zu einer umfassenden Informationsquelle über die Sparse-Dateien. Hier ist der fehlende Teil für Win32:
Ordentlicher Artikel mit Beispielen
Tool, das schätzt, ob es sinnvoll ist, eine Datei als sparse zu erstellen
Grüße
hdiutil kann mit spärlichen Bildern und Dateien umgehen, aber leider ist das Framework, auf das es verweist, privat.
Sie könnten versuchen, externe Symbole wie im DiskImages-Framework definiert zu definieren, aber dies ist höchstwahrscheinlich nicht für Produktionscode akzeptabel, und da das Framework privat ist, müssen Sie seine Anwendungsfälle zurückentwickeln.
cristi: ~ diciu $ otool -L / usr / bin / hdiutil
/ usr / bin / hdiutil: /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (Kompatibilitätsversion 1.0.8, aktuelle Version 194.0.0) [..]
cristi: ~ diciu $ nm /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages | awk -F '' '{print $ 3}' | c ++ filt | grep -i spärlich
[..]
CSparseFile :: sector2Band (lang lang)
CSparseFile :: addIndexNode ()
CSparseFile :: readIndexNode (lange lange, SparseFileIndexNode *)
CSparseFile :: readHeaderNode (CBackingStore *, SparseFileHeaderNode *, unsigned lang)
[... für die Kürze geschnitten]
Späteres Bearbeiten
Sie könnten hdiutil als externen Prozess verwenden und ein spärliches Disk-Image für Sie erstellen lassen. Aus dem C-Prozess würden Sie dann eine Datei im (angehängten) Disk-Image erstellen.
Wenn Sie Portabilität wünschen, sollten Sie als letzte Möglichkeit eine eigene Zugriffsfunktion schreiben, um einen Index und eine Reihe von Blöcken zu verwalten.
Im Wesentlichen verwalten Sie eine einzelne Datei, während das Betriebssystem die Festplatte verwaltet, wobei die Kette der Blöcke, die Teil der Datei sind, die Bitmap der zugewiesenen / freien Blöcke usw. enthält.
Natürlich wird dies zu einem nicht optimierten und langsameren Zugriff führen. Ich würde dieses Verfahren nur empfehlen, wenn die Anforderung, Speicherplatz zu sparen, absolut kritisch ist und Sie genug Zeit haben, um eine robuste Gruppe von Zugriffsfunktionen zu schreiben.
Und selbst in diesem Fall würde ich zuerst untersuchen, ob Ihr Problem eine andere Lösung benötigt. Wahrscheinlich sollten Sie Ihre Daten anders speichern?
Wenn Sie (fseek, ftruncate, ...) nach dem Ende suchen, wird die Dateigröße erhöht, ohne Blöcke zuzuweisen, bis Sie in die Löcher schreiben. Aber es gibt keine Möglichkeit, eine magische Datei zu erstellen, die Blöcke von Nullen automatisch in Löcher konvertiert. Sie müssen es selbst tun.
Dies kann hilfreich sein, um zu sehen (der OpenBSD cp Befehl fügt Löcher ein, anstatt Nullen zu schreiben). patch
OS X scheint sparsame Dateien auf UDF-Volumes zu unterstützen. Ich habe das Testprogramm von Titantecoy unter OS X 10.9 ausprobiert und dabei eine Sparse-Datei auf einem UDF-Disk-Image erstellt. Außerdem wird UFS in OS X nicht mehr unterstützt. Wenn Sie also nur sparse Dateien benötigen, ist UDF das einzige nativ unterstützte Dateisystem, das diese unterstützt.
Ich habe auch das Programm auf SMB-Aktien versucht. Wenn der Server Ubuntu (ext4-Dateisystem) ist, erstellt das Programm eine Sparse-Datei, aber "ls -ls" über SMB zeigt dies nicht an. Wenn Sie "ls -ls" auf dem Ubuntu-Host selbst ausführen, zeigt dies, dass die Datei spärlich ist. Wenn der Server Windows XP (NTFS-Dateisystem) ist, generiert das Programm keine Sparse-Datei.
Tags und Links c macos filesystems