%3F.png)
¿Hay alguna manera de acceder a open()
un archivo y hacer que se reduzca? Por supuesto, uno puede abrirlos en modo agregar o buscar hasta el final y escribir para que crezcan. Sin embargo, hasta donde yo sé, no existe ningún método para reducir un archivo a través de interfaces de llamadas al sistema típicas de estilo Unix.
La única forma de hacerlo, hasta donde yo sé, es falsificándolo creando un nuevo archivo más corto 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 cambiarle el nombre en su lugar.
Siempre he pensado que la API de archivos en libc y las interfaces de llamadas al sistema de estilo Unix no permitían la reducción de archivos para facilitar la implementación de los sistemas de archivos y tal vez evitar patrones de uso que pudieran contribuir a la fragmentación.
Respuesta1
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).
continúa diciendo que si usa ftruncate debe haber abierto el archivo para escribirlo, y si usa truncate, el archivo debe poder escribirse.
Respuesta2
Elopen(2)
La llamada al sistema acepta la O_TRUNC
bandera que puede reducir el tamaño del archivo:
O_TRUNC
– Si el archivo existe y es un archivo normal y se abre correctamenteO_RDWR
oO_WRONLY
, su longitud se truncará a 0 y el modo y el propietario no se modificarán. No tendrá ningún efecto sobre archivos especiales FIFO o archivos de dispositivos terminales. Su efecto sobre otros tipos de archivos está definido por la implementación. El resultado de usarO_TRUNC
sinO_RDWR
oO_WRONLY
no está definido.
Se utiliza con frecuencia cuando el programa pretende sobrescribir por completo el contenido de un archivo. Un ejemplo es el operador de redirección de archivos de su shell como en command > file
.