"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > ## Como você copia arquivos esparsos sem expandi-los no Go?

## Como você copia arquivos esparsos sem expandi-los no Go?

Publicado em 2024-11-08
Navegar:472

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

Arquivos esparsos se tornam colossais com io.Copy()

O problema

Ao copiar arquivos esparsos usando io.Copy(), eles geralmente aumentam dramaticamente em tamanho no destino.

Compreendendo a natureza dos arquivos esparsos

io.Copy() transfere bytes brutos, o que mascara a presença de lacunas em um arquivo esparso – os espaços onde não há dados realmente reside. Esta informação não é acessível através de syscalls padrão como read(2). Como tal, io.Copy() é incapaz de preservar a dispersão dos arquivos.

Enfrentando o problema

Para resolver isso, precisamos nos aprofundar usando o pacote syscall e o tratamento manual. Chamadas de sistema Lseek(2), com valores especiais SEEK_HOLE e SEEK_DATA, podem ser usadas para manipular falhas em arquivos.

Implementação

  1. Use syscall.Seek() para controlar a localização dentro o arquivo.
  2. Determine os valores SEEK_HOLE e SEEK_DATA específicos para a plataforma de destino.
  3. Leia as regiões que contêm dados e ignore as regiões de buracos.

Considerações para Sparse Transferência de arquivos

Se você deseja manter a dispersão de um arquivo durante a transferência, a situação é mais complicada. Fallocate(2) pode ser empregado para tentar criar buracos em sistemas de arquivos suportados. No entanto, alguns sistemas de arquivos carecem inerentemente de suporte a furos, como a família FAT.

Notas adicionais

  1. Verifique se os diretórios de origem e destino residem no mesmo sistema de arquivos. Nesse caso, usar syscall.Rename() ou os.Rename() em vez de copiar pode preservar o tamanho e os atributos do arquivo.
  2. Consulte a edição nº 13548 do Go para obter mais informações sobre o tratamento de arquivos esparsos em arquivos tar.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3