Rozmiar folderu (prawa dostępu)

0

Napisałem program do obliczania rozmiaru folderu i się kompiluje ale jak biorę na obliczenie rozmiaru dysku np. D:\ to wywala ze NIE MA dostępu "UnauthorizedAccessException" wyrzuca na folderze System Volume Information. Jak poprawić program żeby omijało to. Kombinowałem z usuwaniem wpisu z tablicy tego folderu ale wtedy wywala na obliczaniu rozmiaru plików.
Chętnie posłucham sugestii.

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace prog
{
    class Program
    {
        static void Main()
        {
           Console.WriteLine("Rozmiar folderu wynosi:");
           string zaczyn = @"D:\";
           rozmiar.Rozmiar(zaczyn);
           float obli = dane.mb / 1024;
           obli = obli / 1024;
           Console.WriteLine(obli);
           Console.Read();
        }
    }
    public class rozmiar
    {
        static public void Rozmiar(string sciezka)
        {
            dane.mb = 0;
            rozmiar.pfol(sciezka);
            rozmiar.Lokalizacje(sciezka);
        }
       static public void pfol(string p)
        {
            try
            {
                string[] a = Directory.GetFiles(p, "*.*");
                long b = 0;
                foreach (string name in a)
                {
                    FileInfo info = new FileInfo(name);
                    b += info.Length;
                }
                dane.mb += b;
            }
           catch(UnauthorizedAccessException e){}
        }
        static public void Lokalizacje(string patch)
        {
            try
            {
               string[] lok = Directory.GetDirectories(patch);
                foreach (string szuk in lok)
                {
                    pfol(szuk);
                    Lokalizacje(szuk);
                }
            }
           catch(UnauthorizedAccessException e){}
        }
    }
    public class dane
    {
        public static long mb;
    }
}
0

przecież masz try/catch, tylko cokolwiek bezmyślnie ulokowane. w razie wyjątku przerywasz całą pętlę, a chyba wystarczy przejść do następnej iteracji?

0

static public void pfol(string p)
co to znaczy „pfol”?

brakuje funkcji, która zwracałaby rozmiar podanego folderu. czegoś jak

public static long rozmiar(string path)
0

nie komentujmy jakości tego kodu, bo przyczepić można się do wielu rzeczy.
akurat rozmiar masz prawidłowo dodawany do dane.mb += b;, gdzie dane.mb to zmienna statyczna klasy dane...

3

nie komentujmy jakości tego kodu, bo przyczepić można się do wielu rzeczy.
zawsze komentuję jakość kodu (a zwłaszcza gdy nie mam nic do powiedzenia w temacie), gdyż wychodzę z założenia, że odpowiedź na pytanie pomoże mu tylko w tym problemie, ale wytknięcie stylu w tym i każdym przyszłym.

0
Azarien napisał(a)

zawsze komentuję jakość kodu (a zwłaszcza gdy nie mam nic do powiedzenia w temacie)
:D

to w takim razie wytykaj wszystko, a nie jeden element.

0

Dzięki za wytknięcie błędów. Już poprawiłem i dobrze oblicza. Wasze rady są cenne zwłaszcza ze uczę się programować od miesiąca. Chyba najlepiej jest robić skomplikowany program i dzielić go na mniejsze programiki. Więc teraz zacznę głowić i uczyć nad synchronizacją wątków do zapisu plików.

0

chyba masz na myśli "klasę", a nie program.
jest taka metodologia programowania, która sugeruje, aby klasa robiła maksymalnie 3-4 rzeczy, jeśli robi więcej, to trzeba ją rozbić na mniejsze.
jak chcesz się uczyć programowania obiektowego, to używaj static tylko tam, gdzie to niezbędne, bo inaczej programowanie z obiektowego robi się funkcyjne.
nie wystawiaj publicznych zmiennych, tym bardziej nie rób klasy tylko do trzymania publicznej zmiennej statycznej.
każda klasa zajmuje się tylko swoimi rzeczami, więc możesz zrobić klasę DirectorySize z publicznym niestatycznym! getterem (lub getterami dla różnych wielkości - B, kB, ..., TB) i metodą do zwiększania trzymanego już rozmiaru.
łap wyjątki na jak najmniejszych blokach kodu i tylko tam gdzie trzeba, try/catch kosztuje cykle procesora.
nazywaj wszystko po angielsku, albo chociaż trzymaj się jednej konwencji nazewniczej i najlepiej niech to będzie camel-case.
formatuj przejrzyście kod (wizualne oddzielenie od siebie kodu metod, to samo dla klas).
...

0
ŁF napisał(a)

jak chcesz się uczyć programowania obiektowego, to używaj static tylko tam, gdzie to niezbędne, bo inaczej programowanie z obiektowego robi się funkcyjne.

Funkcyjne??

0

proceduralne i strukturalne. ale się czepiasz...

1 użytkowników online, w tym zalogowanych: 0, gości: 1