%3F.png)
Есть ли способ получить open()
файл и заставить его сжаться? Конечно, можно открыть его в режиме добавления или перейти к концу и записать, чтобы заставить его увеличиться. Однако, насколько мне известно, не существует метода сжать файл через типичные интерфейсы системных вызовов в стиле unix.
Насколько мне известно, единственный способ сделать это — подделать его, создав новый, более короткий файл и rename()
заменив им старый.
Я просто хотел подтверждения, потому что видел ответ, подразумевающий, что можно создать редакторы файлов, которые будут работать непосредственно с файлом, а не проходить процесс создания нового файла и переименования его на месте.
Я всегда думал, что файловый API в libc и интерфейсы системных вызовов в стиле Unix не позволяют сжимать файлы, чтобы упростить реализацию файловых систем и, возможно, избежать шаблонов использования, которые могут способствовать фрагментации.
решение1
man -s 2 ftruncate
говорит
DESCRIPTION
The truncate() and ftruncate() functions cause the regular file
named by path or referenced by fd to be truncated to a size of precisely
length bytes.
...
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).
Далее говорится, что если вы используете ftruncate, вы должны открыть файл для записи, а если вы используете truncate, файл должен быть доступен для записи.
решение2
Theopen(2)
системный вызов принимает O_TRUNC
флаг, который может уменьшить размер файла:
O_TRUNC
– Если файл существует и является обычным файлом, и файл успешно открытO_RDWR
илиO_WRONLY
, его длина будет усечена до 0, а режим и владелец останутся неизменными. Он не будет иметь никакого эффекта на специальные файлы FIFO или файлы терминальных устройств. Его эффект на другие типы файлов определяется реализацией. Результат использованияO_TRUNC
безO_RDWR
илиO_WRONLY
не определен.
Он часто используется, когда программа стремится полностью перезаписать содержимое файла. Примером может служить оператор перенаправления файлов вашей оболочки, как в command > file
.