«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > ## Как копировать разреженные файлы, не расширяя их в Go?

## Как копировать разреженные файлы, не расширяя их в Go?

Опубликовано 8 ноября 2024 г.
Просматривать:667

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

Разреженные файлы становятся колоссальными с помощью io.Copy()

Проблема

При копировании разреженных файлов с помощью io.Copy() они часто раздуваются существенного размера в месте назначения.

Понимание природы разреженных файлов

io.Copy() передает необработанные байты, что маскирует наличие дыр в разреженном файле – пробелов, в которых нет данных на самом деле проживает. Эта информация недоступна через стандартные системные вызовы, такие как read(2). Таким образом, io.Copy() не способен сохранять разреженность файлов.

Решение проблемы

Чтобы решить эту проблему, нам нужно углубиться в работу, используя пакет системных вызовов и ручную обработку. Системные вызовы Lseek(2) со специальными значениями SEEK_HOLE и SEEK_DATA могут использоваться для манипулирования дырами в файлах.

Реализация

  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