En utilisant uniquement les fonctionnalités de Posix, quel est le moyen le plus efficace de faire grandir un fichier en X octets?

Mon programme Posix C doit faire évoluer un fichier vers X octets, généralement 128 Mo ou 256 Mo.

L’approche actuelle consiste à initialiser une mémoire tampon de 16 Mo et à écrire le tampon à plusieurs resockets dans le fichier ouvert à l’aide de fwrite .

Existe-t-il une approche plus efficace?

Vous pouvez utiliser l’appel système ftruncate .

Vous pouvez rapidement remplir un fichier avec tous les zéros en cherchant un décalage et en y écrivant un octet. Le contenu du fichier avant ce décalage sera rempli avec des zéros si le fichier n’était pas déjà grand.

Sous Linux, cela créera un fichier fragmenté . Le fichier apparaîtra de 256 Mo mais il utilisera très peu d’espace sur le disque.

Utilisez ftruncate , malgré son nom, il peut également être utilisé pour étendre les fichiers. Cela peut être légèrement moins portable comparé à votre méthode actuelle car posix ne nécessite pas que ftruncate puisse étendre un fichier (mais XSI le fait)

Remarque sur les fichiers fragmentés – que toutes les réponses créent pour vous

code:

 // ft.c int main() { FILE*fp=fopen("sparse", "w"); ftruncate(fileno(fp), 2147483647UL); fclose(fp); return 0; } 

affiche le disque avant et après l’exécution ./ft:

 me@mycomputer ~> gcc ft.c -o ft me@mycomputer ~> du -sh . 368M . me@mycomputer ~> df -h . Filesystem Size Used Available Capacity Mounted on / 98G 8.3G 89G 9% / me@mycomputer ~> ./ft me@mycomputer ~> df -h . Filesystem Size Used Available Capacity Mounted on / 98G 8.3G 89G 9% / me@mycomputer ~> du -sh . 368M . me@mycomputer ~> ls -l sparse -rw-r--r-- 1 me other 2147483647 Dec 10 12:55 sparse 

Maintenant, nous sauvegardons peu:

 me@mycomputer ~> tar cvf /tmp/my.tar.tar ./sparse a ./sparse 2097152K 

Ensuite, nous restaurons peu de données à partir de la sauvegarde:

 me@mycomputer ~> tar xf /tmp/my.tar.tar . me@mycomputer ~> du -sh . 2.4G . me@mycomputer ~> df -h . Filesystem Size Used Available Capacity Mounted on / 98G 10G 87G 11% / 

Voila – nous avons gagné 2 Go. Les fichiers fragmentés sont un excellent moyen de créer une sorte de récupération négative future – une éventuelle erreur de disque. L’exemple ci-dessus est sur le disque système – une fois que le disque système est plein à 100%, le système a toutes sortes de problèmes désagréables.

Cela est dû au fait que la restauration des fichiers (peut-être des mois plus tard) gonfle les fichiers fragmentés sur le disque à leur taille “réelle”. Et vous les avez oubliés entre-temps.

Pensez sérieusement à ne pas créer ces choses en premier lieu, il n’y a généralement aucune exigence pour le faire.