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.
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;
}