Maison  >  Article  >  développement back-end  >  ## Comment copier des fichiers fragmentés sans les développer dans Go ?

## Comment copier des fichiers fragmentés sans les développer dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 08:31:03227parcourir

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

Les fichiers clairsemés deviennent colossaux avec io.Copy()

Le problème

Lors de la copie de fichiers clairsemés à l'aide de io.Copy(), ils gonflent souvent considérablement en taille à la destination.

Comprendre la nature des fichiers clairsemés

io.Copy() transfère les octets bruts, ce qui masque la présence de trous dans un fichier clairsemé - les espaces où aucune donnée réside réellement. Ces informations ne sont pas accessibles via des appels système standard comme read(2). En tant que tel, io.Copy() est incapable de préserver la rareté des fichiers.

Résoudre le problème

Pour résoudre ce problème, nous devons approfondir l'utilisation du package syscall et de la gestion manuelle. Les appels système Lseek(2), avec des valeurs spéciales SEEK_HOLE et SEEK_DATA, peuvent être utilisés pour manipuler des trous dans les fichiers.

Implémentation

  1. Utilisez syscall.Seek() pour contrôler l'emplacement dans le fichier.
  2. Déterminez les valeurs SEEK_HOLE et SEEK_DATA spécifiques à la plate-forme cible.
  3. Lisez à partir des régions contenant des données et ignorez les régions de trous.

Considérations pour Sparse Transfert de fichiers

Si vous souhaitez conserver la rareté d'un fichier lors du transfert, la situation est plus complexe. Fallocate(2) peut être utilisé pour tenter de créer des trous sur les systèmes de fichiers pris en charge. Cependant, certains systèmes de fichiers ne prennent pas en charge les trous, comme la famille FAT.

Notes supplémentaires

  1. Vérifiez si les répertoires source et de destination résident sur le même système de fichiers. Si tel est le cas, utiliser syscall.Rename() ou os.Rename() au lieu de copier peut préserver la taille et les attributs du fichier.
  2. Reportez-vous au numéro Go n° 13548 pour plus d'informations sur la gestion des fichiers fragmentés dans les fichiers tar.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn