>  기사  >  백엔드 개발  >  ## Go에서 희소 파일을 확장하지 않고 어떻게 복사하나요?

## Go에서 희소 파일을 확장하지 않고 어떻게 복사하나요?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 08:31:03227검색

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

io.Copy()를 사용하면 희소 파일이 거대해집니다

문제

io.Copy()를 사용하여 희소 파일을 복사할 때 파일이 부풀어오르는 경우가 많습니다.

스파스 파일의 특성 이해

io.Copy()는 원시 바이트를 전송하여 스파스 파일의 홀(데이터가 없는 공간)의 존재를 마스킹합니다. 실제로 거주합니다. 이 정보는 read(2)와 같은 표준 syscall을 통해 접근할 수 없습니다. 따라서 io.Copy()는 파일의 희소성을 보존할 수 없습니다.

문제 해결

이 문제를 해결하려면 syscall 패키지와 수동 처리를 사용하여 더 깊이 파고들어야 합니다. 특별한 SEEK_HOLE 및 SEEK_DATA 값이 있는 Lseek(2) 시스템 호출을 사용하여 파일의 구멍을 조작할 수 있습니다.

구현

  1. syscall.Seek()를 사용하여 파일 내의 위치를 ​​제어하세요.
  2. 대상 플랫폼에 특정한 SEEK_HOLE 및 SEEK_DATA 값을 결정합니다.
  3. 데이터가 포함된 영역에서 읽고 구멍 영역을 무시합니다.

Sparse에 대한 고려 사항 파일 전송

전송 중에 파일의 희소성을 유지하려는 경우 상황은 더욱 복잡해집니다. Fallocate(2)를 사용하여 지원되는 파일 시스템에서 홀 생성을 시도할 수 있습니다. 그러나 일부 파일 시스템에는 FAT 제품군과 같이 본질적으로 홀 지원이 부족합니다.

추가 참고 사항

  1. 소스 및 대상 디렉터리가 동일한 파일 시스템에 있는지 확인하세요. 그렇다면 복사하는 대신 syscall.Rename() 또는 os.Rename()을 사용하면 파일의 크기와 속성을 보존할 수 있습니다.
  2. tar 파일의 희소 파일 처리에 대한 자세한 내용은 Go 문제 #13548을 참조하세요.

위 내용은 ## Go에서 희소 파일을 확장하지 않고 어떻게 복사하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.