Exemple de code : Calculer la taille totale d'un répertoire (C#)

by Fabien Lavocat 20. June 2008 00:07
Nous allons voir comment avec deux petites fonctions, calculer la taille totale d’un répertoire et afficher sa taille en Mo.

Commencez déjà par importer le namespace System.IO :

using System.IO;

Ensuite nous allons créer une fonction récurcive afin de pouvoir pouvoir entrer dans les sous-répertoires.

   1: private Int64 DirectoryLength(DirectoryInfo folder)
   2: {
   3:     Int64 bytes = 0;
   4:     foreach (FileInfo fi in folder.GetFiles())
   5:         bytes += fi.Length;
   6:  
   7:     foreach (DirectoryInfo i in folder.GetDirectories())
   8:         bytes += DirectoryLength(i);
   9:  
  10:     return bytes;
  11: }

Cette fonction prend en paramètre un objet de type "DirectoryInfo” qui représente le dossier à analyser. Elle parcourt la liste des fichiers présents dans ce dossier et récupére leur taille. Ensuite on cherche s’il y a des sous-répertoires présents, si c’est le cas, on appelle la même fonction avec  le répertoire courant.

L’appel de la fonction :

   1: private void Form1_Load(object sender, EventArgs e)
   2: {
   3:     // Le @ permet d'échapper tous les caractères spéciaux
   4:     String folder = @"C:\DossierATester\";
   5:  
   6:     // Si le dossier n'existe pas on arrête de traitement
   7:     if (!Directory.Exists(folder))
   8:         return;
   9:  
  10:     // Le dossier existe, on peut calculer sa taille
  11:     Int64 size = DirectoryLength(new DirectoryInfo(folder));
  12:  
  13:     // Ensuite on l'affiche
  14:     Console.WriteLine("Taille du dossier '{0}' : {1} Mo", folder, size.ToMo());
  15: }

Mais qu’est ce que "size.ToMo()” ?

Une méthode d’extention :

   1: public static class Functions
   2: {
   3:     public static String ToMo(this Int64 input)
   4:     {
   5:         // N02 permet d'afficher au format : 1 234.56
   6:         return (input / (1024 * 1024)).ToString("N02");
   7:     }
   8: }

Petite information, si je n’ai utilisé que des Int64 c’est que la méthode Lenght() retourne un objet de type long et vous le savez, long est un alias de Int64 (comme string qui est un alias de String), et que je n’aime pas trop, pour la visibilité du code, travailler avec des alias.

Maintenant un petit quiz !!!

Int32 est une classe. Vrai ou Faux ?

Tags:

Exemples de code

Comments

7/27/2008 3:17:42 PM #

Narbonne

Pour la question à la fin je reconnais sa pertinence.
Bien que dubitatif, je tenterais "oui c'est une classe" avec pour argument qu'il est dans System.Int32 et qu'il a des méthodes dont parse...
Mais comme ces méthodes s'utilisent en statique, peut être que Int32 qui est dans le namespace System est une "boite à outils" pour gérer les Int32 qui a ce moment là ne serait pas des classes... Puis pour renseigner le champ de valeur du Int32 faut bien y mettre quelque chose de défini... De ce fait peut être que non du coup...

petite recherche plus tard:
public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>

c'est une structure

^^

Narbonne France

7/29/2009 8:42:19 AM #

moi

long est un alias de Int32 ???!!!!
Je ne savais pas, je pensais que long etait un alias de int64 et que int etait un alias de int32.
Mais je pense que c'est une erreur de frappe car c'est bien Int64 qui a été utilisé pour la taille des fichiers.
et que le pattern etait d'utiliser les types du languages, donc d'utiliser int, long lorsqu'on etait en C#.
Et que cela ne change rien à la visibilité du code, sauf lorsqu'on est amené a changer frequemment de langage, donc il vaut meiux utiliser les types du CLR.

moi France

7/30/2009 1:01:45 AM #

Fabien Lavocat

Effectivement, simple erreur de ma part, "long" est l'alias de Int64. int est l'alias de Int32.
Je corrige de suite.

Fabien Lavocat France

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading



About

Fabien Lavocat

Lavocat Fabien
Ingénieur Multimédia - TMM Communication



"Blog-Microsoft.fr is an independent blog and is not affiliated with, nor has it been authorized, sponsored, or otherwise approved by Microsoft Corporation."

Contactez-moi Send mail

MVP
Microsoft Most Valuable Professional
Client Application Development