"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ## ¿Cómo se copian archivos dispersos sin expandirlos en Go?

## ¿Cómo se copian archivos dispersos sin expandirlos en Go?

Publicado el 2024-11-08
Navegar:581

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

Los archivos dispersos se vuelven colosales con io.Copy()

El problema

Al copiar archivos dispersos usando io.Copy(), a menudo se inflan dramáticamente en tamaño en el destino.

Comprender la naturaleza de los archivos dispersos

io.Copy() transfiere bytes sin procesar, lo que enmascara la presencia de agujeros en un archivo disperso: los espacios donde no hay datos realmente reside. No se puede acceder a esta información a través de llamadas al sistema estándar como read(2). Como tal, io.Copy() es incapaz de preservar la escasez de archivos.

Abordar el problema

Para solucionar esto, debemos profundizar más utilizando el paquete syscall y el manejo manual. Las llamadas al sistema Lseek(2), con valores especiales SEEK_HOLE y SEEK_DATA, se pueden usar para manipular agujeros en archivos.

Implementación

  1. Utilice syscall.Seek() para controlar la ubicación dentro el archivo.
  2. Determine los valores SEEK_HOLE y SEEK_DATA específicos de la plataforma de destino.
  3. Lea desde regiones que contienen datos e ignore las regiones vacías.

Consideraciones para Sparse Transferencia de archivos

Si desea mantener la escasez de un archivo durante la transferencia, la situación es más complicada. Fallocate(2) se puede emplear para intentar la creación de agujeros en sistemas de archivos compatibles. Sin embargo, algunos sistemas de archivos carecen inherentemente de soporte completo, como la familia FAT.

Notas adicionales

  1. Verifique si los directorios de origen y destino residen en el mismo sistema de archivos. Si es así, usar syscall.Rename() u os.Rename() en lugar de copiar puede preservar el tamaño y los atributos del archivo.
  2. Consulte el número 13548 de Go para obtener más información sobre el manejo de archivos dispersos en archivos tar.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3