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.

Neregistrovaný

Zobrazeno 50 zpráv z 56.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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" />"
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.
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.
jak si získal "user složku".? Jaký je její path? Nehrabeš se náhodou ve složce cizího uživatele?
Řekl bych, že asi takto :
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
To nebyl dotaz na tebe, ale na autora.
Doufám že tam nijak neskládáš string.
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..
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/?…
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
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ůř.
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.
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.
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.
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.
Nevím proč by se mělo plést Profil a Dokumenty, profil odkazuje do
profilu, dokumenty do dokumentů
Evidentně jsi vůbec nepochopil kde je problém, samozřejmě, že podsložky opět nezískáš.
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.
I kdyby to permission měl, zapisoval bys úplně jinam, než kam zapisovat chceš. Proto ti v tom systém zabránil.
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..
Prosímtě tomáš přečti si tu tutorial pro práci se soubory.
http://www.itnetwork.cz/csharp/soubory
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?
Asi máš na mysli tohle:
string cesta = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DevbookTutorial");
string soubor = Path.Combine(cesta, "databaze.dat");
Tak nám ty chytrolíne ještě řekni co ten program má vlastně dělat.
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ů.
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;
}
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 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.
No ještě že mě máš...
Tak ještě jendou Děkuju
A jestli to tu je tak to tu můžete uzavřít
jinak, tam kam ten program nedostane přístup, tak tam se na to vykašle.
Koukám, že ses vykašlal na ošetřování výjimek. Také to tak v jednom programu mám.
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.
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
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).
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.
Zobrazeno 50 zpráv z 56.