Existe uma maneira de open()
um arquivo e fazer com que ele encolha? Pode-se, é claro, abri-los no modo de acréscimo ou procurar até o fim e escrever para fazê-los crescer. No entanto, até onde eu sei, não existe um método para reduzir um arquivo por meio de interfaces de chamada de sistema típicas no estilo unix.
A única maneira de fazê-lo, até onde eu sei, é falsificá-lo criando um novo arquivo menor e rename()
no lugar do antigo.
Eu só queria confirmação, porque vi uma resposta que implicava que era possível criar editores de arquivos que funcionassem diretamente em um arquivo, em vez de passar pelo processo de criar um novo e renomeá-lo.
Eu sempre pensei que a API do arquivo nas interfaces de chamada de sistema libc e estilo unix não permitia o encolhimento de arquivos para facilitar a implementação de sistemas de arquivos e talvez evitar padrões de uso que possam contribuir para a fragmentação.
fonte
fopen
no modo "w" (ou "w +") para truncá-lo no tamanho zero automaticamente. Ou você quer dizer encolher para um tamanho diferente de zero, para preservar parte do conteúdo antigo?open()
eopenat()
já possui um sinalizador para truncar,O_TRUNC
portanto , tecnicamente, o arquivo diminui - ou seja, diminui completamente - sem alterar o inode. O exemplo mais famoso disso écommand > file.txt
que o arquivo será truncado, se existir. Se você executarstrace
embash -c 'true > /dev/null'
que você veráopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
na saída. Obviamente, para tamanho variável de truncamento, você precisa dotruncate()
syscall. Deixe-me saber se você quer isso como uma resposta real em vez do comentário.Respostas:
man -s 2 ftruncate
diz...
continua dizendo que, se você usar ftruncate, deverá ter aberto o arquivo para gravação e, se usar truncado, o arquivo deverá ser gravável.
fonte
truncate
o acomode primeiro para o novo tamanho do arquivo e depois parawrite
ele. Assimtruncate
é a chamada do sistema que você está procurando.fallocate(FALLOC_FL_COLLAPSE_RANGE)
A
open(2)
chamada do sistema aceita oO_TRUNC
sinalizador que pode reduzir o tamanho do arquivo:É freqüentemente usado quando o programa pretende sobrescrever completamente o conteúdo de um arquivo. Um exemplo é o operador de redirecionamento de arquivos do seu shell, como em
command > file
.fonte