C # pobieranie ścieżki% AppData%

387

C # 2008 SP1

Korzystam z poniższego kodu:

dt.ReadXml("%AppData%\\DateLinks.xml");

Dostaję jednak wyjątek wskazujący lokalizację, z której działa moja aplikacja:

Nie można znaleźć części ścieżki „D: \ Projekty \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml”.

Myślałem, że %AppData%powinien znaleźć względną ścieżkę. Gdy wchodzę do systemu Start|Run|%AppData%Windows, Eksplorator zabiera mnie do tego katalogu.

Nie mogę podać pełnej ścieżki, ponieważ użytkownik jest inny na każdym komputerze klienckim.

ant2009
źródło

Odpowiedzi:

802

Aby uzyskać katalog AppData , najlepiej użyć GetFolderPathmetody:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(należy dodać, using Systemjeśli nie jest obecny).

%AppData%jest zmienną środowiskową i nie są one automatycznie rozwijane w dowolnym miejscu w .NET, chociaż można to zrobić bezpośrednio przy użyciu tej Environment.ExpandEnvironmentVariablemetody. Nadal jednak zdecydowanie zalecam skorzystanie z niej GetFolderPath, ponieważ, jak zauważa Johannes Rössel w komentarzu, %AppData%może nie być ustalone w pewnych okolicznościach.

Na koniec, aby utworzyć ścieżkę, jak pokazano w przykładzie:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");
Noldorin
źródło
45
+1 za zaoferowanie prawdziwego rozwiązania, nie polegającego na środowisku. Aby dodać do odpowiedzi: Nie każda funkcja obsługująca nazwy plików rozszerza zmienne środowiskowe. W rzeczywistości zazwyczaj musisz to zrobić jawnie, w przeciwnym razie to nie zadziała i skończysz z folderem% coś%. Ponadto środowisko nie musi być obecne, w niektórych przypadkach podczas uruchamiania programu na innym koncie użytkownika środowisko użytkownika nie zostanie załadowane, a% Appdata% będzie puste. Dlatego chcesz używać udokumentowanych interfejsów API do pobierania tych folderów (chyba że używasz plików wsadowych).
Joey
@Johannes: Dobra informacja. Właśnie zmieniłem moją odpowiedź, kiedy to napisałeś, ale wyjaśnię, że GetFolderPath jest zdecydowanie lepsza niż ExpandEnvironmentVariable.
Noldorin
+1 dla Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), byłem za tym od kilku dni.
Sumit Ghosh
1
Z jakiegoś powodu Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)zwraca mi pusty ciąg (IIS 7, VS 2011). Problem rozwiązany za pomocą rozwiązania Simon_Weaver - mapowanie za pomocą MapPath.
Mike Keskinov,
52
Informacje, które dają katalog mobilny dla lokalnej aplikacji AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)
roundcrisis
49

Ścieżka jest inna, jeśli używasz ASP.NET.

Nie mogłem znaleźć żadnych wartości „SpecialFolder”, które wskazywałyby na / App_Data dla ASP.NET.

Zamiast tego musisz to zrobić:

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(Uwaga: nie potrzebujesz właściwości „Current” w kontrolerze MVC)

Jeśli istnieje inny bardziej „abstrakcyjny” sposób, App_Datachciałbym się dowiedzieć, jak to zrobić.

Simon_Weaver
źródło
Tylko uwaga, ponieważ rdzeń asp.net wychodzi teraz. Podejście to opiera się w szczególności na IIS.
George Mauer,
7
HostingEnvironment.MapPath(@"~/App_Data")jest lepszy i działa zarówno w kontekście MVC / WebAPI, jak i WCF, w których nie ma HttpContext - ale nie ma pewności co do rdzenia
Simon_Weaver
36

BEST sposobem korzystania katalog AppData, IS w użyciu Environment.ExpandEnvironmentVariablemetody.

Powody:

  • zastępuje części ciągu przez prawidłowe katalogi lub cokolwiek innego
  • nie uwzględnia wielkości liter
  • jest to łatwe i nieskomplikowane
  • to standard
  • dobre do radzenia sobie z danymi wejściowymi użytkownika

Przykłady:

string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

Pamiętaj, że niektórzy użytkownicy piszą %AppData%, niektórzy, %appdata%a niektórzy z %APpData% nich nie chcą:

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

Jeśli zmienna środowiskowa nie jest ustawiona, to nie twoja wina (poza tym, kiedy JEST ). Zwykle nie mówię ludziom, żeby nie wymyślali na nowo koła, ale po raz pierwszy poszedłem w inną stronę i zdałem sobie sprawę, że to zły pomysł.

Bitterblue
źródło
Podobały mi się twoje przykłady pathzmiennych :)
RBT
+1 Environment.ExpandEnvironmentVariablejest najlepsze, gdy trzeba po prostu rozwinąć, niezależnie od tego, które zmienne env mogą znajdować się w ciągu ścieżki.
blins
24

Możesz także użyć

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

rozwinąć %AppData%zmienną.

parapet
źródło
15

W .net2.0 możesz użyć zmiennej Application.UserAppDataPath

Nathan
źródło
20
To jest tylko Winforms.
7

Nie sądzę, aby umieszczanie% AppData% w takim ciągu działało.

próbować

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
danswain
źródło
4

Chciałem tylko udostępnić inny sposób dostępu do folderu „App_Data” w mojej aplikacji mvc na wypadek, gdyby ktoś tego potrzebował.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
cpoDesign
źródło
Może nie jest to właściwa odpowiedź, ale tego właśnie szukałem. +1
Derrick
Pracowałem dla mnie po zastąpieniu pojedynczych cudzysłowów podwójnymi cudzysłowami. Path.Combine (HttpRuntime.AppDomainAppPath, „App_Data”)
ajaysinghdav10d
1

Działa to dla mnie w aplikacji konsolowej -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");
Rachunek
źródło
1

W przypadku ASP.NET Load User Profileustawienie należy ustawić w puli aplikacji, ale to nie wystarczy. Istnieje ukryte ustawienie o nazwie setProfileEnvironmentin \Windows\System32\inetsrv\Config\applicationHost.config, które z jakiegoś powodu jest domyślnie wyłączone, a nie włączone zgodnie z opisem w dokumentacji . Możesz zmienić wartość domyślną lub ustawić ją w puli aplikacji. Wszystkie metody w Environmentklasie zwrócą wówczas prawidłowe wartości.

MoonStom
źródło