"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > ## Comment copier des fichiers fragmentés sans les développer dans Go ?

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

Publié le 2024-11-08
Parcourir:890

## 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 fichiers bruts octets, qui masquent la présence de trous dans un fichier clairsemé – les espaces où aucune donnée ne 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 plateforme cible.
  3. Lire depuis les régions contenant des données et ignorer les régions de trous.

Considérations relatives au transfert de fichiers clairsemés

Si vous souhaitez conserver la parcimonie d'un fichier pendant le 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.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3