Есть ли способ для open()
файла и вызвать его сжатие? Можно, конечно, открыть их в режиме добавления или искать до конца и написать, чтобы они росли. Однако, насколько я знаю, нет способа сжать файл через типичные интерфейсы системных вызовов в стиле Unix.
Насколько я знаю, единственный способ сделать это - подделать его, создав новый более короткий файл, а rename()
не старый.
Я просто хотел получить подтверждение, потому что увидел ответ, который подразумевал, что можно создать файловые редакторы, работающие непосредственно с файлом, вместо того, чтобы проходить процесс создания нового и переименовывать его на месте.
Я всегда думал, что файловый интерфейс API в интерфейсах системных вызовов в стиле libc и unix не позволяет уменьшить файлы, чтобы упростить реализацию файловых систем и, возможно, избежать использования моделей, которые могут способствовать фрагментации.
open()
и openat()
уже есть флаг для усечения, O_TRUNC
так что технически это приводит к уменьшению файла - то есть к полному сокращению - без изменения inode. Самый известный пример того command > file.txt
, где файл будет обрезан, если он существует. Если вы бежите strace
на bash -c 'true > /dev/null'
вас будут видеть openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
на выходе. Конечно, для переменного размера усечения вам нужен truncate()
системный вызов. Дайте мне знать, если вы хотите это как реальный ответ вместо комментария.
fopen
в режиме «w» (или «w +») автоматически обрезает его до нулевой длины. Или вы имеете в виду сокращение до ненулевого размера, чтобы сохранить часть старого содержимого?