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.
open()
et openat()
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 celui command > file.txt
où le fichier sera tronqué s'il existe. Si vous exécutez strace
, bash -c 'true > /dev/null'
vous verrez openat(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'un truncate()
appel système. Faites-moi savoir si vous voulez que ce soit une réponse réelle au lieu du commentaire.
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?