C# - Mappa tartalmának összmérete

forráskód letöltése
Ebben a példánkban egy olyan kis alkalmazást készítünk, mely képes egy megadott elérési úton található mappák állományainak méreteit összesítve megjeleníteni. Így könnyedén megtudhatjuk, hogy melyik mappánk mennyi helyet foglal el a háttértáron.
Az eredményt egy ListView kontrolban jelenítjük meg, melynek két oszlopa lesz: az egyik a mappa nevét tartalmazza, a másik pedig a benne lévő állományok összméretét.
    private void button1_Click(object sender, System.EventArgs e)
    {
      listView1.Items.Clear();
Először egy ciklussal végigmegyünk a megadott mappában lévő almappákon és ezek neveit kiírjuk a ListView-ba.
      foreach (string s in Directory.GetDirectories(textBox1.Text))
      {
        listView1.Items.Add(new ListViewItem(Path.GetFileName(s), 0));
A listázást az első három elem után megszakítjuk, mivel ha a megadott mappa sok almappát tartalmaz, akkor a program futási ideje nagyon megnőhet. Ha ez nem okoz problémát, akkor az alábbi feltétel és a break törölhető a forráskódból.
        if (listView1.Items.Count>2)
        {
          break;
        }
      }
Frissítjük a ListView tartalmát, így a nevek már most megjelennek.
      listView1.Update();
      Int64 size;
Egy újabb ciklust indítunk, mely most már a ListView tartalmán megy végig.
      for (int i=0; i<listView1.Items.Count; i++)
      {
Minden almappa esetén meghívjuk belső függvényünket a SumDir-t, mely összegzi a számára megadott elérési útvonalon található összes állomány méretét és ezt visszaadja.
        size = SumDir(Path.Combine(textBox1.Text, listView1.Items[i].Text));
A kapott számot elhelyezzük a ListView-ba és az Update hívásával rögtön frissítjük is annak tartalmát, így a mappa nevek mellett a számok folyamatosan jelennek meg.
        listView1.Items[i].SubItems.Add(size.ToString("### ### ### ### ### ###")); 
        listView1.Update();
      }
Nézzük mit is tesz a SumDir függvényünk.
Létrehozunk egy belső változót, mely az adott mappa állományainak összméretét fogja számlálni.
    private Int64 SumDir(string path)
    {
      Int64 size = 0;
Mivel minden mappa tartalmazhat újabbat, így első lépésként egy ciklussal végignézzük, hogy a kapott elérési útvonalon található-e újabb mappa.
      foreach (string s in Directory.GetDirectories(path))
      {
Ha találunk újabb mappát, akkor rekurzív módon meghívjuk ismét a SumDir-t, hogy ennek tartalma is legyen összegezve, majd a kapott értéket hozzáadjuk a belső számlálónkhoz.
        size += SumDir(s);
      }
Ha már nincs több almappa, akkor sorra vesszük az állományokat.
      FileStream fs;
      foreach (string filename in Directory.GetFiles(path))
      {
        try
        {
Az állományokat sorra megnyitjuk, hogy meghatározhassuk azok méretét, melyet hozzáadunk számlálónkhoz.
       fs=File.OpenRead(filename);
      size += fs.Length;
      fs.Close();
      ...
      return size;
    }