C# DirectoryInfo hibakezelés

C# DirectoryInfo hibakezelés
2015-11-05T09:59:40+01:00
2015-11-05T15:28:42+01:00
2022-10-15T23:05:39+02:00
anonymus0402
Sziasztok! Van egy egyszerű kis kódom, ami fájl infókat kér le. A problémám az, hogy ha egy mappa nem olvasható, akkor kifagy a program. Azt szeretném elérni, hogy ha a keresett helyen egy mappa nem olvasható, akkor ne álljon le a futás, csak írja ki, hogy "nincs hozzáféréses".

DirectoryInfo di = new DirectoryInfo(tbKeresesHelye.Text); foreach (var f in di.GetFiles("*", SearchOption.AllDirectories)) { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; rtbTalalatok.Invoke(new MethodInvoker(delegate { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; })); }
Mutasd a teljes hozzászólást!
Ja, azt hiszem, már értem.
Én itt és most ezt egy sima AllDirectories-zel nem tudnám megoldani, viszont ha készítesz egy rekurzív függvényt, ahol csak TopDirectoryOnly-t használsz, és készítesz egy második ciklust GetDirectories-sel, ahol újrahívod a függvényt minden alkönyvtárral, az működhet. Ekkor ugye ha egy alkönyvtár olvasása nem sikerül, akkor nem fog megszakadni a folyamat.

Tegyük fel, hogy magát a függvényt is rögtön DirectoryInfo-val hívod, akkor ilyen egyszerű:

void Nezegesd(DirectoryInfo di) { try { foreach (var f in di.GetFiles()) { if(rtbTalalatok.InvokeRequired) { rtbTalalatok.Invoke(new MethodInvoker(delegate { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; })); } else { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; } } foreach (var d in di.GetDirectories()) Nezegesd(d); } catch(Exception ex) {} }
Az a benyomásom, hogy a * és a TopDirectoryOnly együtt pont úgy működik, mint az argumentum nélküli GetFiles, úgyhogy inkább azt használtam.
Mutasd a teljes hozzászólást!

  • A fagyás az nem egy precíz hibajelenség.
    Magamtól azt gondolnám, hogy kapsz egy kivételt. Ha elkapod és ignorálod, valószínűleg nem lesz semmi.
    Kb.

    try { DirectoryInfo di = new DirectoryInfo(tbKeresesHelye.Text); foreach (var f in di.GetFiles("*", SearchOption.AllDirectories)) { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; rtbTalalatok.Invoke(new MethodInvoker(delegate { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; })); } } catch(Exception ex) {}
    Persze jobb lenne, ha megnéznéd, pontosan milyen kivételt kapsz (tegyél egy kiíratást a catch blokkba, vagy használd a debuggert), és csak azt kapnád el. Valamilyen ilyen-olyan Access kivételre tippelnék.
    Mutasd a teljes hozzászólást!
  • Talán egy try catch block használata segítene

    DirectoryInfo di = new DirectoryInfo(tbKeresesHelye.Text); foreach (var f in di.GetFiles("*", SearchOption.AllDirectories)) { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; rtbTalalatok.Invoke(new MethodInvoker(delegate { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; })); }
    pl így: + egy kis kiegészítés

    DirectoryInfo di = new DirectoryInfo(tbKeresesHelye.Text); foreach (var f in di.GetFiles("*", SearchOption.AllDirectories)) { try { if(rtbTalalatok.InvokeRequired) { rtbTalalatok.Invoke(new MethodInvoker(delegate { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; })); } else { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; } } catch{/*IDE jön hogy nem fért hozzá a fájlhoz*/ } } LEÍRÁS
    Mutasd a teljes hozzászólást!
  • Gyorsabb voltál :D
    Mutasd a teljes hozzászólást!

  • Egyébként először olyasmi kódot írtam, mint te, de küldés előtt kitettem a try-catch-et a legszélére. Igazából nem ismerem az API-t, de mivel a könyvtár elérése a sztori, szerintem a "new DirectoryInfo"-s sor halhat meg. Az InvokeRequired-es if-et viszont nagyon jó, hogy beleírtad.
    Mutasd a teljes hozzászólást!
  • A hiba, hogy a di.GetFiles-nen található elérési út nem olvasható. De valószínűleg valamelyik megoldás jó. Majd estefele megpróbálom.
    Mutasd a teljes hozzászólást!
  • Igaz, a new DirectoryInfo valószínűleg magától nem nyúl a fájlrendszerhez.
    Mutasd a teljes hozzászólást!
  • Egyébként van ilyen is

    if(Directory.Exists("blabla")){/*szupi*/}
    Mutasd a teljes hozzászólást!
  • Jó megoldások, csak az a gondom velünk, hogy az első hibánál megáll a futás, és csak azt írja ki az rtb-be. Én viszont azt szeretném, hogy az összes hiba és találat jelenjen meg az rtb-ben.

    Igaz, a new DirectoryInfo valószínűleg magától nem nyúl a fájlrendszerhez.

    És azt hogy lehet megoldani, hogy hozzáférjen? Mert a rendszergazdai futtatás nem segít. Az UAC t nem bírom életre kelteni.
    Mutasd a teljes hozzászólást!
  • Ja, azt hiszem, már értem.
    Én itt és most ezt egy sima AllDirectories-zel nem tudnám megoldani, viszont ha készítesz egy rekurzív függvényt, ahol csak TopDirectoryOnly-t használsz, és készítesz egy második ciklust GetDirectories-sel, ahol újrahívod a függvényt minden alkönyvtárral, az működhet. Ekkor ugye ha egy alkönyvtár olvasása nem sikerül, akkor nem fog megszakadni a folyamat.

    Tegyük fel, hogy magát a függvényt is rögtön DirectoryInfo-val hívod, akkor ilyen egyszerű:

    void Nezegesd(DirectoryInfo di) { try { foreach (var f in di.GetFiles()) { if(rtbTalalatok.InvokeRequired) { rtbTalalatok.Invoke(new MethodInvoker(delegate { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; })); } else { rtbTalalatok.Text = rtbTalalatok.Text + f.FullName + " > " + f.Name + " >> " + f.Length + "byte\n"; } } foreach (var d in di.GetDirectories()) Nezegesd(d); } catch(Exception ex) {} }
    Az a benyomásom, hogy a * és a TopDirectoryOnly együtt pont úgy működik, mint az argumentum nélküli GetFiles, úgyhogy inkább azt használtam.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd