IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
kebabicc
Člen
Avatar
kebabicc:6.1.2014 0:33

Zdravím,
snažím se vytvořit kus kodu, který má zaúkol prohledat C: a vyhledat všechny jpg soubory. Následně jejich cesty a názvy zapsat do textového souboru. Následující kod je funkční, ale vyhazuje mi při prohlédávání celého disku (ne třeba jenom plochy, na které jsem to testoval) následující vyjímku: 'System.Unautho­rizedAccessEx­ception' - přístup k cestě XY byl odepřen. Nevíte co s tím?

string[] fotky = Directory.GetFiles(@"C:\","*.jpg",SearchOption.AllDirectories);
using (StreamWriter sw = new StreamWriter(@"C:\Users\Marek\Desktop\fotky.txt"))
{
sw.WriteLine("--------Fotky--------");
foreach (string name in fotky)
{
sw.WriteLine(name);
}
sw.Flush();
}
Editováno 6.1.2014 0:36
 
Odpovědět
6.1.2014 0:33
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na kebabicc
Jan Vargovský:6.1.2014 0:48

Nemáš k tomu jednoduše přístup.

Vyřešit to můžeš dvěmi způsoby:

  1. Snížit práva v tom adresáři
  2. Spustit jako administrátor

Taková poznámka, když používáš using blok, nemusíš volat Flush();

Editováno 6.1.2014 0:49
 
Nahoru Odpovědět
6.1.2014 0:48
Avatar
kebabicc
Člen
Avatar
Odpovídá na Jan Vargovský
kebabicc:6.1.2014 0:51

To jsem pochopil, že k tomu nemám práva. Mě by spíše zajímalo jak je získat a nebo přeskočit dané složky, kam nemám práva.

 
Nahoru Odpovědět
6.1.2014 0:51
Avatar
kebabicc
Člen
Avatar
Odpovídá na kebabicc
kebabicc:6.1.2014 0:54

S tím administrátorem myslíš přidání práv přímo do programu? (protože spuštění hotové aplikace jako administrátor nepomůže).

 
Nahoru Odpovědět
6.1.2014 0:54
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na kebabicc
Jan Vargovský:6.1.2014 1:03

No, tak nevím kde to leze, když tomu ani administrátor nepomůže :)

static List<string> GetAllFiles(string folder, string pattern, List<string> files)
        {
            files.AddRange(Directory.GetFiles(folder, pattern));
            foreach (string subDir in Directory.GetDirectories(folder))
            {
                try
                {
                    GetAllFiles(subDir, pattern, files);
                }
                catch(Exception ex)
                {
                    Console.WriteLine("didnt have permission to " + subDir);
                }
            }
            return files;
        }

Užití:

var fotky = GetAllFiles(@"C:\", "*.jpg", new List<string>());
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
6.1.2014 1:03
Avatar
kebabicc
Člen
Avatar
Odpovídá na Jan Vargovský
kebabicc:6.1.2014 1:25

Dík, máš to u mně, ale stejně by mně zajímalo, jak zprovoznit ten můj :-) Ale děkuji za Tvé řešení.

 
Nahoru Odpovědět
6.1.2014 1:25
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na kebabicc
Jan Vargovský:6.1.2014 1:34

Ten tvůj nezprovozníš, jednoduše když nemáš práva, tak vyhodí vyjímku a metoda se dál nevykonává. Jde to udělat několika způsoby, nejlepší by bylo, kdyby sis zjistil práva a jestli bys je měl, tak bys iteroval. Ale to se mi implementovat nechtělo, mám svojich věcí plno. Takže jestli to chceš zdokonalit, tak to musíš procházet sám, složka po složce :)

 
Nahoru Odpovědět
6.1.2014 1:34
Avatar
coells
Tvůrce
Avatar
Odpovídá na kebabicc
coells:6.1.2014 16:06

Jan Vargovský má pravdu, musíš to procházet ručně. UnauthorizedAc­cessException je zcela legitimní postup, jak se dozvědět, že nemáš práva na adresář. Pokud ti nevadí trochu nepřehledný kód, pak se to dá zapsat v krátké verzi pomocí enumerací.

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<string> collection = EnumerateFiles(@"c:\", "*.jpg");
        foreach (var file in collection)
            Console.WriteLine(file);
    }

    static IEnumerable<string> EnumerateFiles(string path, string searchPattern)
    {
        try
        {
            return Directory.GetFiles(path, searchPattern).Concat(Directory.GetDirectories(path).SelectMany(info => EnumerateFiles(info, searchPattern)));
        }
        catch (UnauthorizedAccessException)
        {
            return new string[0];
        }
    }
}
 
Nahoru Odpovědět
6.1.2014 16:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.