Heim >Backend-Entwicklung >Golang >## 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?

Susan Sarandon
Susan SarandonOriginal
2024-10-26 08:31:03313Durchsuche

## 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 Am Ziel nimmt die Größe 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 sich keine Daten befinden 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 uns mit dem Syscall-Paket und der manuellen Handhabung eingehender befassen. 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 SEEK_HOLE- und SEEK_DATA-Werte, die für die Zielplattform spezifisch sind.
  3. Lesen Sie aus datenhaltigen Regionen und ignorieren Sie Lückenregionen.

Überlegungen für Sparse Dateiübertragung

Wenn Sie die 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 im selben 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.

Das obige ist der detaillierte Inhalt von## Wie kopiert man Dateien mit geringer Dichte, ohne sie in Go zu erweitern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn