„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > ## Wie kopiert man Dateien mit geringer Dichte, ohne sie in Go zu erweitern?

## Wie kopiert man Dateien mit geringer Dichte, ohne sie in Go zu erweitern?

Veröffentlicht am 08.11.2024
Durchsuche:721

## How Do You Copy Sparse Files Without Expanding Them in Go?

Sparse-Dateien werden mit io.Copy() kolossal

Das Problem

Beim Kopieren von spärlichen Dateien mit io.Copy() werden sie oft größer Die Größe nimmt am Ziel dramatisch zu.

Die Natur von Sparse-Dateien verstehen

io.Copy() überträgt Rohbytes, was das Vorhandensein von Lücken in einer Sparse-Datei maskiert – die Bereiche, in denen keine Daten vorhanden sind tatsächlich wohnt. Auf diese Informationen kann nicht über Standard-Systemaufrufe wie read(2) zugegriffen werden. Daher ist io.Copy() nicht in der Lage, die Spärlichkeit von Dateien beizubehalten.

Das Problem angehen

Um dieses Problem zu lösen, müssen wir mithilfe des Syscall-Pakets und der manuellen Handhabung tiefer eintauchen. Lseek(2)-Systemaufrufe mit speziellen SEEK_HOLE- und SEEK_DATA-Werten können verwendet werden, um Lücken in Dateien zu manipulieren.

Implementierung

  1. Verwenden Sie syscall.Seek(), um den Speicherort darin zu steuern die Datei.
  2. Bestimmen Sie die für die Zielplattform spezifischen SEEK_HOLE- und SEEK_DATA-Werte.
  3. Lesen Sie aus datenhaltigen Regionen und ignorieren Sie Lückenregionen.

Überlegungen zu Sparse Dateiübertragung

Wenn Sie die spärliche Dichte einer Datei während der Übertragung beibehalten möchten, ist die Situation komplizierter. Fallocate(2) kann verwendet werden, um die Erstellung von Lücken in unterstützten Dateisystemen zu versuchen. Allerdings fehlt einigen Dateisystemen von Natur aus die Lückenunterstützung, wie etwa die FAT-Familie.

Zusätzliche Hinweise

  1. Überprüfen Sie, ob sich die Quell- und Zielverzeichnisse auf demselben Dateisystem befinden. Wenn ja, können die Größe und Attribute der Datei durch die Verwendung von syscall.Rename() oder os.Rename() anstelle des Kopierens erhalten bleiben.
  2. Weitere Einblicke in die Handhabung spärlicher Dateien in TAR-Dateien finden Sie im Go-Problem Nr. 13548.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3