¿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

fopenen 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_TRUNCpor 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 ejecutastraceen 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 ftruncatedice...
continúa diciendo que si usa ftruncate debe haber abierto el archivo para escribir, y si usa truncate, el archivo debe poder escribirse.
fuente
truncatelo acomode primero para el nuevo tamaño de archivo y luegowritelo haga . Asítruncatees la llamada al sistema que estás buscando.fallocate(FALLOC_FL_COLLAPSE_RANGE)La
open(2)llamada al sistema acepta elO_TRUNCindicador 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