Je sais que la façon normale d'obtenir la taille d'un fichier serait d'utiliser une instance FileInfo:
using System.IO;
class SizeGetter
{
public static long GetFileSize(string filename)
{
FileInfo fi = new FileInfo(filename);
return fi.Length;
}
}
Existe-t-il un moyen de faire la même chose sans avoir à créer une instance de FileInfo, en utilisant une méthode statique?
Peut-être que j'essaie d'être trop avare avec la création d'une nouvelle instance chaque fois que je veux une taille de fichier, mais prenez par exemple en essayant de calculer la taille totale d'un répertoire contenant plus de 5000 fichiers. Aussi optimisé que soit le GC, ne devrait-il pas y avoir un moyen de le faire sans devoir le taxer inutilement?
Ne t'en fais pas. Tout d'abord, l'allocation dans .NET est bon marché. Deuxièmement, cet objet sera dans la génération 0, il doit donc être collecté sans trop de surcharge.
Ne t'en fais pas.
J'ai trouvé un article de blog de quelqu'un qui a mesuré les frais généraux de création d'objet dans .NET ( essais de création d'objet C # ), et, il s'avère que la création de 10 000 objets a pris 0,03 seconde, c'est-à-dire, 3 µs par objet. Le temps nécessaire pour lire la longueur du fichier à partir du système de fichiers dominera certainement ces 3 microsecondes de manière significative.
Un grand nombre de méthodes statiques du framework .NET créent en interne des objets et appellent des méthodes d'instance dessus (vous pouvez le vérifier en regardant la source de référence ou en utilisant un outil de réflexion). Vous supposez qu'une méthode statique est plus rapide. Ne faites pas de telles hypothèses. Si vous avez deux façons de faire la même chose, mesurez laquelle est la plus rapide.
Si vous avez vraiment, vraiment besoin d'une méthode statique, utilisez l'API native GetFileSize
ou GetFileSizeEx
. Mais gardez à l'esprit que cela nécessitera un handle vers le fichier à partir de l'API CreateFile
.
Vous pouvez également afficher la source de la classe FileInfo
:
http://referencesource.Microsoft.com/#mscorlib/system/io/fileinfo.cs#4ee673c1a4ecad41