NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
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í.

Diskuze: Přístup do UserFolder // Access denied!

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:20.7.2013 22:15

Ahoj :)
Potřebuju nějak napsat povolení pro program, aby mohl do User složky...
Vždy mi napíše že přístup byl odepřen :/

foreach (string d in Directory.GetDirectories(b))
          {
              try
              {

                  if ((d == data) || (d == appdata))
                  {
                      continue;
                  }
                  else
                  {
                      foreach (string f in Directory.GetFiles(d, pic))
                      {

                      }

                  }

              }
              catch (System.Exception excpt)
              {
                  Console.WriteLine(excpt.Message);

              }

Ví někdo jak to vyřešit?

Předem Děkuji :)

 
Odpovědět
20.7.2013 22:15
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:20.7.2013 22:35

Zkoušel jsi to spustit jako administrátor ? Jednoduše, to že jsi programátor ti nedává nárok se dostat tam, kam běžní uživatelé nemohou. Takže tam nejspíš bude problém s právy složky.

EDIT: Kdybys to chtěl přímo z debugu spouštět jako administrátor, tak si přidej do projectu "Application Manifest File" a tam si najdi řádek

<requestedExecutionLevel level="asInvoker" uiAccess="false" />"

a ten přepiš na

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />"
Editováno 20.7.2013 22:40
 
Nahoru Odpovědět
20.7.2013 22:35
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Kit:20.7.2013 22:40

Proč by to měl spouštět s právy administrátora? Pokud bude ten program napsaný správně, půjde to i bez nich. Chce se přece dostat do legální složky, jen si asi popletl cestu.

Spouštět si nefunkční programy jako administrátor je dobrý způsob, jak si zdemolovat systém.

Editováno 20.7.2013 22:42
Nahoru Odpovědět
20.7.2013 22:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Kit
Jan Vargovský:20.7.2013 23:06

Jestli si jen zobrazuje obsah, tak natom nevidím nic zlého. Jinak s Tebou souhlasím.
K tématu, trošku jsem to testoval co tomu vadí a co ne a vadí tomu hidden directories, jinak k ostatním by ses měl normálně dostat.

 
Nahoru Odpovědět
20.7.2013 23:06
Avatar
Michal Žůrek - misaz:20.7.2013 23:08

jak si získal "user složku".? Jaký je její path? Nehrabeš se náhodou ve složce cizího uživatele?

 
Nahoru Odpovědět
+1
20.7.2013 23:08
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Jan Vargovský:20.7.2013 23:34

Řekl bych, že asi takto :

Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
 
Nahoru Odpovědět
20.7.2013 23:34
Avatar
Odpovídá na Jan Vargovský
Michal Žůrek - misaz:21.7.2013 8:56

To nebyl dotaz na tebe, ale na autora.

Doufám že tam nijak neskládáš string.

 
Nahoru Odpovědět
21.7.2013 8:56
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:21.7.2013 9:59

No to je zas jednou kód, slyšel jsi někdy o metodách?

Nahoru Odpovědět
21.7.2013 9:59
New kid back on the block with a R.I.P
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš :21.7.2013 12:27

Tady je celý kod :)

string pic = "*.jpg";
           string b = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
           string appdata = Path.Combine(b, "AppData");
           string data = Path.Combine(b, "Data aplikací");



           foreach (string d in Directory.GetDirectories(b))
           {
               try
               {

                   if ((d == data) || (d == appdata))
                   {
                       continue;
                   }
                   else
                   {
                       foreach (string f in Directory.GetFiles(d, pic))
                       {

                       }

                   }

               }
               catch (System.Exception excpt)
               {
                   Console.WriteLine(excpt.Message);

               }
           }

Přes administrátora jsem to zkoušel už dřív nic...
Ty skrytí složky mam vyloučeny aby to nehledalo...
Na složce mam že s ní může dělat každý uživatel cokoliv ale furt to nejde..

 
Nahoru Odpovědět
21.7.2013 12:27
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 12:51

To Sdraco : Ano metody znám ale tohle jsem sepsal takto jelikož mi to nejde..

Zde je ještě obrázek.
http://photo.uloziste.com/?…

 
Nahoru Odpovědět
21.7.2013 12:51
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:21.7.2013 13:38

Problém je v tom, že tohle nejsou pravé názvy složek, ale jen české přesměrování. Koukni se třeba sem: http://social.msdn.microsoft.com/…torygetfiles

Nahoru Odpovědět
21.7.2013 13:38
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.7.2013 13:45

Když byly na Linuxu zavedeny lokalizované názvy některých složek, tak jsem z toho zpočátku byl také zmatený. Všechny se však nacházejí v domovském adresáři, takže to není zas tak velký problém. Uživatelé s Windows jsou na tom o něco hůř.

Nahoru Odpovědět
21.7.2013 13:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 14:42

To Sdraco: A ten program si to nedokáže najít sám? :-D

A prohlížel jsem to.. A nějak furt nechápu co tam nemam nebo chybí :/
To je asi nad muj rámec možností :)

 
Nahoru Odpovědět
21.7.2013 14:42
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:21.7.2013 14:49

Jak vidíš, tak asi nedokáže :) Řeší se to v tom vláknu co jsem ti poslal, musíš použít nějaké ty reparse pointy, nikdy jsem to nepotřeboval, protože když chci uživatelskou složku, tak pro ni má C# getter.

Nahoru Odpovědět
21.7.2013 14:49
New kid back on the block with a R.I.P
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na David Hartinger
Tomáš:21.7.2013 14:53

Takže se to dá obejít jinak než přes Foreach?

 
Nahoru Odpovědět
21.7.2013 14:53
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:21.7.2013 14:54

Přečti si konečně co jsem ti poslal :)

Nahoru Odpovědět
21.7.2013 14:54
New kid back on the block with a R.I.P
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na David Hartinger
Tomáš:21.7.2013 15:01

Dobře Děkuji.. :)

 
Nahoru Odpovědět
21.7.2013 15:01
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.7.2013 15:16

Problém bude asi v tom, že mnoho návodů, které jsem našel, je o práci se soubory, jejichž cesta začíná C:\..., což je špatně. O zmíněných getterech jsem nenašel nic.

Netrápí mě to, protože na unixových systémech si obvykle vystačím se znakem ~ na začátku cesty k souboru.

Nahoru Odpovědět
21.7.2013 15:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:21.7.2013 15:22

C# ti prostě dá složku o kterou si řekneš, třeba takhle:

string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Možná to není getter ale enum nebo konstanta nezkoumal jsem to, ale neřešíš tu žádné přesměrování nebo verzi windows a podobně. těch složek tam je spoustu.

Nahoru Odpovědět
+1
21.7.2013 15:22
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.7.2013 15:29

Aha, takže stačí původní

string b = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

nahradit

string b = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Vypadá to podobně a jak je vidět, dá se to poplést.

Nahoru Odpovědět
21.7.2013 15:29
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:21.7.2013 15:30

Nevím proč by se mělo plést Profil a Dokumenty, profil odkazuje do profilu, dokumenty do dokumentů :)

Nahoru Odpovědět
21.7.2013 15:30
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:21.7.2013 15:32

Tomáš je důkazem, že to poplést jde :)

Nahoru Odpovědět
21.7.2013 15:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 15:34

Klídek klídek zase :D

S Dokumentama to stejne nefunguje.. Podsložky dokumnetů jsou videa obrázky.... A tam to m¨píše že přístup byl odepřen...

Nic to neřeší když vezmete složku z UserProfile složky.

 
Nahoru Odpovědět
21.7.2013 15:34
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:21.7.2013 15:41

Evidentně jsi vůbec nepochopil kde je problém, samozřejmě, že podsložky opět nezískáš.

Nahoru Odpovědět
21.7.2013 15:41
New kid back on the block with a R.I.P
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 15:46

No nepochopil.. Moje znalosti C sharp nesahají nějak extra daleko..
Myslel jsem že to bude jednoduší.. Sepsání nejaký permission..
Ale Děkuji za snahu :)

 
Nahoru Odpovědět
21.7.2013 15:46
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:21.7.2013 15:49

Prostě tyhle složky nezískáš tak snadno, protože 1. jsou v každém systému jinde a zadruhé tam je ajzykové přesměrování, proto když do nějaké z nich potřebuješ, použiješ ten getter.

Nahoru Odpovědět
21.7.2013 15:49
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:21.7.2013 16:09

I kdyby to permission měl, zapisoval bys úplně jinam, než kam zapisovat chceš. Proto ti v tom systém zabránil.

Nahoru Odpovědět
21.7.2013 16:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 16:12

Dobře řekl bych že oboum problémum jsme se ted vyhnul :)
Použil jsem getter:

string path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

A hledal jsem ihned v něm:

string pic = "*.jpg";
           string path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
try
               {
foreach (string f in Directory.GetFiles(path, pic))
                      {

                      }
 }
               catch (System.Exception excpt)
               {
                   Console.WriteLine(excpt.Message);

               }

Do složky jsme si naházel pár obrázků. A ani jeden mi to neukázalo..

 
Nahoru Odpovědět
21.7.2013 16:12
Avatar
Michal Žůrek - misaz:21.7.2013 16:16

Prosímtě tomáš přečti si tu tutorial pro práci se soubory.
http://www.itnetwork.cz/csharp/soubory

 
Nahoru Odpovědět
21.7.2013 16:16
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:21.7.2013 16:31

Přiznej se, že jsi už něco četl od Majakovského? Není zrovna jednoduché to po tobě číst. Proč to odsazování nenecháš na editoru?

Do které složky sis naházel obrázky, které teď nemůžeš najít? Snad ne do profilu?

Nahoru Odpovědět
21.7.2013 16:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:21.7.2013 16:35

Asi máš na mysli tohle:

string cesta = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DevbookTutorial");
string soubor = Path.Combine(cesta, "databaze.dat");
Nahoru Odpovědět
21.7.2013 16:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 16:40

Ne nikdy jsem od něj nic nečetl :-D
Moje lehké zaklady jsme se naučil ve škole.. A tohle jsme ani nebrali..
Dělali jsme takové ty kalkulačky, šachy atd... Žádne programy preté by

Ty obrázky vim kde jsou ale program je tam nenajde v té složce..

 
Nahoru Odpovědět
21.7.2013 16:40
Avatar
Odpovídá na
Michal Žůrek - misaz:21.7.2013 16:42

Tak nám ty chytrolíne ještě řekni co ten program má vlastně dělat.

 
Nahoru Odpovědět
21.7.2013 16:42
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 16:42

Omlouvám se...

Které by se snažili něco získat nebo nějakm dostat a tak.. :)

 
Nahoru Odpovědět
21.7.2013 16:42
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 16:45

Má mi vypsat všechny adresáře Obrázků..

a začíná v Userprofile...
Takže by měl project Dokumenty, Plochu a další složky na ploše..

Ps: Neřikám že jsem chytrolín..

 
Nahoru Odpovědět
21.7.2013 16:45
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:21.7.2013 17:06

Práce s adresářovou strukturou není triviální. Učí se to obvykle až později, protože to ani není moc potřebné.

V C# by na to mohla být přímo nějaká metoda, která by ti dodala seznam souborů podle požadavků.

Editováno 21.7.2013 17:08
Nahoru Odpovědět
21.7.2013 17:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na
Michal Žůrek - misaz:21.7.2013 17:14

To más sloužit jen tobě?

 
Nahoru Odpovědět
21.7.2013 17:14
Avatar
Odpovídá na
Michal Žůrek - misaz:21.7.2013 17:24

Víš ty co, já ti ten program napíšu. Počkej 5 min.

 
Nahoru Odpovědět
21.7.2013 17:24
Avatar
Odpovídá na
Michal Žůrek - misaz:21.7.2013 17:37

Tady máš celý zdrojový kód:

public static void Main(String[] arg)
{
        string userFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

        List<string> files = ProhledejSlozku(userFolder);

        foreach (string f in files) {
                Console.WriteLine(f);
        }
        Console.ReadKey();
}

public static List<string> ProhledejSlozku(string path) {
        List<string> soubory = new List<string>();
        try {
                string[] podslozky = System.IO.Directory.GetDirectories(path);
                foreach (string p in podslozky) {
                        soubory.AddRange(ProhledejSlozku(p));
                }

        } catch (Exception) {
        }
        try {
                string[] fotky = System.IO.Directory.GetFiles(path, "*.jpg");
                foreach (string f in fotky) {
                        Console.WriteLine(f);
                }

        } catch (Exception) {
        }
        return soubory;
}
Editováno 21.7.2013 17:38
 
Nahoru Odpovědět
21.7.2013 17:37
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na Michal Žůrek - misaz
Tomáš:21.7.2013 17:52

Wow! Děkuju moc! :)

 
Nahoru Odpovědět
21.7.2013 17:52
Avatar
Odpovídá na
Michal Žůrek - misaz:21.7.2013 17:58

Není zač, pro mě je taková aplikace záležitost na 10 minut, zvlášť když polovinu za mě udělal .NET. Dávej si pozor, aplikace všechny cesty vipisuje 2x :D Zakomentuj si osmý řádek kódu.

Ten kód si projdi, ať výš co dělá a jak funguje. Doufám že si natolik slušný a program nenajdu nikde na netu.

Editováno 21.7.2013 17:58
 
Nahoru Odpovědět
21.7.2013 17:58
Avatar
Tomáš
Neregistrovaný
Avatar
Tomáš:21.7.2013 18:08

Neboj na web to házet nebudu ;)

Měl jsem to podobně, ale nefungovalo mi to no...

Tohle tma být nemusí ne jen to vypisuje znova celej list..

foreach (string f in files)
          {
              Console.WriteLine(f);
          }

Ještě jedno Děkuju :)

 
Nahoru Odpovědět
21.7.2013 18:08
Avatar
Odpovídá na
Michal Žůrek - misaz:21.7.2013 18:19

To že to vše vypisuje 2x, už vím.

 
Nahoru Odpovědět
21.7.2013 18:19
Avatar
Tomáš
Neregistrovaný
Avatar
Odpovídá na Michal Žůrek - misaz
Tomáš:21.7.2013 18:30

No ještě že mě máš... :P
Tak ještě jendou Děkuju :)
A jestli to tu je tak to tu můžete uzavřít :)

 
Nahoru Odpovědět
21.7.2013 18:30
Avatar
Odpovídá na
Michal Žůrek - misaz:21.7.2013 19:32

jinak, tam kam ten program nedostane přístup, tak tam se na to vykašle.

 
Nahoru Odpovědět
21.7.2013 19:32
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:21.7.2013 19:41

Koukám, že ses vykašlal na ošetřování výjimek. Také to tak v jednom programu mám.

Nahoru Odpovědět
21.7.2013 19:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek - misaz:21.7.2013 19:42

no to jsou právě ty acces denied, mě to taky třeba nepusti do hlubin appdata. Nechtělo se mi to plácat k cestám do výstupu.

Jinak já to tak občas dělám, proč bych to ošetřoval.

Editováno 21.7.2013 19:43
 
Nahoru Odpovědět
+1
21.7.2013 19:42
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:21.7.2013 19:49

Tohle je jeden z mála případů, kdy má smysl tu výjimku neošetřovat. Místo ošetření do toho místa obvykle píšu "// Výjimečně zde není ošetření výjimky", aby si někdo nemyslel, že jsem pako. On si to pak myslí tuplem :)

Nahoru Odpovědět
21.7.2013 19:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek - misaz:21.7.2013 19:55

Já jsem se s tím setkal u práce s vlastními soubory, kde musíš zjistit zda uživatel otevřel nějaký soubor přes tvou aplikaci a ošetřit to no a pokud nic neotevřel tak je to prázdé a hází to vyjimku, jenomže přeci není chyba když uživatel otevřel aplikaci normálně (bez souboru).

 
Nahoru Odpovědět
21.7.2013 19:55
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:21.7.2013 20:02

Pokud jsem to pochopil správně, tak se ptáš systému na seznam otevřených souborů. Pokud není otevřený žádný, vyhodí to výjimku? Trochu nešikovné a chápu, že to řešíš takhle.

Nahoru Odpovědět
21.7.2013 20:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 50 zpráv z 56.