Je crée une application de téléchargement et je souhaite préallouer de la place sur le disque dur pour les fichiers avant qu'ils ne soient réellement téléchargés car ils pourraient être plutôt volumineux, et personne n'aime voir "Ce lecteur est plein, s'il vous plaît supprimer quelques fichiers encore." Donc, dans cette optique, j'ai écrit ceci.Préallouer l'espace fichier en C#?
// Quick, and very dirty
System.IO.File.WriteAllBytes(filename, new byte[f.Length]);
Il fonctionne, atleast jusqu'à ce que vous téléchargez un fichier qui est plusieurs centaines de Mo de, ou peut-être même Go de et vous jetez Windows dans une frénésie raclée sinon éliminer totalement le fichier d'échange et de tuer vos systèmes de mémoire tout à fait. Oops. Donc, avec un peu plus d'illumination, je pars avec l'algorithme suivant.
using (FileStream outFile = System.IO.File.Create(filename))
{
// 4194304 = 4MB; loops from 1 block in so that we leave the loop one
// block short
byte[] buff = new byte[4194304];
for (int i = buff.Length; i < f.Length; i += buff.Length)
{
outFile.Write(buff, 0, buff.Length);
}
outFile.Write(buff, 0, f.Length % buff.Length);
}
Cela fonctionne bien, et ne souffre pas du problème de mémoire paralysant de la dernière solution. C'est quand même lent, surtout sur le matériel plus ancien car il écrit (peut-être la valeur de GB) des données sur le disque. La question est la suivante: Y a-t-il une meilleure façon d'accomplir la même chose? Existe-t-il un moyen de dire à Windows de créer un fichier de taille x et d'allouer simplement l'espace sur le système de fichiers plutôt que d'écrire réellement une tonne de données. Je ne m'inquiète pas de l'initialisation des données dans le fichier (le protocole que j'utilise - bittorrent - fournit des hachages pour les fichiers qu'il envoie, donc le pire des cas pour des données non initialisées aléatoires est une coïncidence chanceuse et une partie du fichier est correct).
ouais, c'est plus simple que ma solution :-) – Mark