"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > ## Go에서 희소 파일을 확장하지 않고 어떻게 복사하나요?

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

2024-11-08에 게시됨
검색:696

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

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

문제

io.Copy()를 사용하여 희소 파일을 복사할 때 파일이 부풀어오르는 경우가 많습니다. 대상의 크기가 극적으로 증가합니다.

Sparse의 특성 이해 Files

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

문제 해결

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

구현

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

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

데이터가 포함된 영역에서 파일의 희소성을 유지하려는 경우 옮기면 상황은 더 복잡해진다. Fallocate(2)를 사용하여 지원되는 파일 시스템에서 홀 생성을 시도할 수 있습니다. 그러나 일부 파일 시스템에는 FAT 계열과 같이 본질적으로 홀 지원이 부족합니다.

추가 참고 사항

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

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3