¿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.
fuente
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?open()
yopenat()
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 escommand > file.txt
, donde el archivo se truncará si existe. Si se ejecutastrace
en elbash -c 'true > /dev/null'
que veremosopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
en la salida. Por supuesto, para un tamaño variable de truncamiento necesitatruncate()
syscall. Avíseme si desea que esto sea una respuesta real en lugar del comentario.Respuestas:
man -s 2 ftruncate
dice...
continúa diciendo que si usa ftruncate debe haber abierto el archivo para escribir, y si usa truncate, el archivo debe poder escribirse.
fuente
truncate
lo acomode primero para el nuevo tamaño de archivo y luegowrite
lo haga . Asítruncate
es la llamada al sistema que estás buscando.fallocate(FALLOC_FL_COLLAPSE_RANGE)
La
open(2)
llamada al sistema acepta elO_TRUNC
indicador que puede reducir el tamaño del archivo:Se usa con frecuencia cuando el programa tiene como objetivo sobrescribir el contenido de un archivo por completo. Un ejemplo es el operador de redirección de archivos de su shell como en
command > file
.fuente