Existe-t-il un moyen d'accéder à open()
un fichier et de le réduire? On peut, bien sûr, les ouvrir en mode ajout ou chercher à la fin et écrire pour les faire grandir. Cependant, pour autant que je sache, il n'existe aucune méthode pour réduire un fichier via des interfaces d'appel système de style Unix typiques.
Pour autant que je sache, la seule façon de le faire est de le simuler en créant un nouveau fichier plus court et rename()
à la place de l'ancien.
Je voulais juste une confirmation, car j'ai vu une réponse qui impliquait qu'il était possible de créer des éditeurs de fichiers qui travaillaient directement sur un fichier au lieu de passer par le processus de création d'un nouveau et de le renommer en place.
J'ai toujours pensé que l'API de fichier dans les interfaces d'appel système de style libc et unix ne permettait pas la réduction des fichiers pour faciliter l'implémentation des systèmes de fichiers et peut-être éviter les modèles d'utilisation qui pourraient contribuer à la fragmentation.
fopen
en mode "w" (ou "w +") le tronquera automatiquement à zéro. Ou voulez-vous dire de réduire à une taille non nulle, pour préserver certains des anciens contenus?open()
etopenat()
ont déjà un indicateur pour tronquer,O_TRUNC
donc techniquement cela fait rétrécir le fichier - c'est-à-dire rétrécir complètement - sans changer d'inode. L'exemple le plus célèbre est celuicommand > file.txt
où le fichier sera tronqué s'il existe. Si vous exécutezstrace
,bash -c 'true > /dev/null'
vous verrezopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
dans la sortie. Bien sûr, pour une taille de troncature variable, vous avez besoin d'untruncate()
appel système. Faites-moi savoir si vous voulez que ce soit une réponse réelle au lieu du commentaire.Réponses:
man -s 2 ftruncate
dit...
il ajoute que si vous utilisez ftruncate, vous devez avoir ouvert le fichier pour l'écriture, et si vous utilisez truncate, le fichier doit être accessible en écriture.
la source
truncate
s'adapter à la nouvelle taille de fichier, puis àwrite
lui. Il entruncate
va de même pour l'appel système que vous recherchez.fallocate(FALLOC_FL_COLLAPSE_RANGE)
L'
open(2)
appel système accepte l'O_TRUNC
indicateur qui peut réduire la taille du fichier:Il est fréquemment utilisé lorsque le programme vise à remplacer entièrement le contenu d'un fichier. Un exemple est l'opérateur de redirection de fichiers de votre shell comme dans
command > file
.la source