¿Hay alguna forma de open()
archivo y hacer que se encoja? Uno puede, por supuesto, abrirlos en modo anexar o buscar hasta el final y escribir para hacerlos crecer. Sin embargo, hasta donde yo sé, no hay ningún método para reducir un archivo a través de interfaces de llamada de sistema de estilo unix típico.
La única forma de hacerlo, hasta donde yo sé, es fingirlo creando un nuevo archivo más corto y rename()
en lugar del anterior.
Solo quería confirmación, porque vi una respuesta que implicaba que era posible crear editores de archivos que funcionaran directamente en un archivo en lugar de pasar por el proceso de crear uno nuevo y renombrarlo en su lugar.
Siempre he pensado que la API de archivo en libc y las interfaces de llamada de sistema de estilo Unix no permitían la reducción de archivos para facilitar la implementación de sistemas de archivos y tal vez evitar patrones de uso que podrían contribuir a la fragmentación.
open()
y openat()
ya tengo una bandera para truncar, O_TRUNC
por lo que técnicamente hace que el archivo se encoja, es decir, se encoja por completo, sin cambiar el inodo. El ejemplo más famoso de eso es command > file.txt
, donde el archivo se truncará si existe. Si se ejecuta strace
en el bash -c 'true > /dev/null'
que veremos openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
en la salida. Por supuesto, para un tamaño variable de truncamiento necesita truncate()
syscall. Avíseme si desea que esto sea una respuesta real en lugar del comentario.
fopen
en modo "w" (o "w +") lo truncará a cero automáticamente. ¿O te refieres a reducir a un tamaño distinto de cero para preservar algunos de los contenidos anteriores?