C # отримання шляху% AppData%


387

C # 2008 SP1

Я використовую наведений нижче код:

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

Однак я отримую виняток, який вказує на місце, де працює моя програма:

Не вдалося знайти частину шляху "D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml".

Я думав, що %AppData%слід знайти відносний шлях. Коли я заходжу, Start|Run|%AppData%Провідник Windows відводить мене до цього каталогу.

Я не можу прокласти повний шлях, оскільки користувач різний на кожній клієнтській машині.

Відповіді:


802

Щоб отримати каталог AppData , найкраще скористатися GetFolderPathметодом:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(потрібно додати, using Systemякщо немає)

%AppData%є змінною середовища, і вони автоматично не розширюються ніде в .NET, хоча ви можете явно використовувати Environment.ExpandEnvironmentVariableметод для цього. Я все-таки настійно пропоную вам скористатися GetFolderPath, оскільки, як в коментарі вказує Йоганнес Рессель, за %AppData%певних обставин це може бути не встановлено.

Нарешті, щоб створити шлях, як показано у вашому прикладі:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

45
+1 за те, що пропонують справжнє рішення, не покладаючись на навколишнє середовище. Щоб додати відповідь: Не кожна функція, яка обробляє імена файлів, розширює змінні середовища. Насправді, зазвичай вам це потрібно явно робити, інакше це не працює, і ви отримаєте% щось% папки. Крім того, середовище не повинно бути присутнім, у деяких випадках при запуску програми під іншим обліковим записом користувача середовище користувача не завантажуватиметься, а% Appdata% буде порожнім. Ось чому ви хочете використовувати документовані API для отримання цих папок (якщо ви не використовуєте пакетні файли).
Joey

@Johannes: Хороша інформація. Я щойно змінив свою відповідь, коли ви це опублікував, але я стану зрозумілішим, що GetFolderPath, безумовно, кращий перед ExpandEnvironmentVariable.
Нолдорін

+1 для Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), я стояв за цим пару днів.
Суміт Гош

1
Чомусь Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)для мене повертає порожню рядок (IIS 7, VS 2011). Проблема вирішена за допомогою рішення Simon_Weaver - відображення за допомогою MapPath.
Майк Кескінов

52
FYI, що дає каталог Roaming для локальної AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)
круглий кризис

49

Шлях інший, якщо ви говорите на ASP.NET.

Я не зміг знайти жодне зі значень "SpecialFolder", яке вказувало на / App_Data для ASP.NET.

Замість цього вам потрібно зробити це:

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

(Примітка. Не потрібно властивості "Поточний" в контролері MVC)

Якщо є ще один "абстрактніший" спосіб дістатися, я App_Dataхотів би почути, як це зробити.


Лише зауваження, оскільки ядро ​​asp.net виходить зараз. Цей підхід спеціально спирається на IIS.
Джордж Мауер

7
HostingEnvironment.MapPath(@"~/App_Data")краще і працює в контекстах MVC / WebAPI та WCF, де немає HttpContext - але не впевнений у ядрі "
Simon_Weaver,

36

Кращий спосіб використовувати каталог AppData, IS , щоб використовувати Environment.ExpandEnvironmentVariableметод.

Причини:

  • він замінює частини вашої рядка дійсними каталогами чи будь-яким іншим
  • це нечутливе до регістру
  • це легко і непросто
  • це стандарт
  • добре для роботи з введенням користувачів

Приклади:

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

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

Запам’ятайте деякі типи користувачів %AppData%, деякі %appdata%та деякі, з якими %APpData% ви не хочете закінчуватись:

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

Якщо змінна середовища не встановлена, це не ваша вина (до того ж, коли вона є ). Зазвичай я не кажу людям не вигадувати колесо, але після того, як я вперше пішов іншим шляхом і зрозумів, що це погана ідея.


Сподобалися ваші приклади pathзмінної :)
RBT

+1 Environment.ExpandEnvironmentVariableнайкраще, коли вам просто потрібно розгорнути незалежно від того, яка середовище може бути в рядку шляху.
Блін

24

Ви також можете використовувати

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

для розширення %AppData%змінної.


15

У .net2.0 ви можете використовувати змінну Application.UserAppDataPath


20
Це лише Winforms.

7

Я не думаю, що введення% AppData% у такий рядок буде працювати.

спробуйте

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

4

Просто хотів поділитися іншим способом доступу до папки "App_Data" у моєму додатку mvc у випадку, якщо комусь це потрібно.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")

Можливо, це не буде правильною відповіддю, але це те, що я шукав. +1
Деррік

Для мене працювали після заміни одинарних лапок подвійними лапками. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10

1

Це працює для мене в консольному додатку -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

Для ASP.NET це Load User Profileналаштування потрібно встановити в пулі додатків, але цього недостатньо. Існує прихований параметр, названий setProfileEnvironmentв \Windows\System32\inetsrv\Config\applicationHost.config, який чомусь вимикається за замовчуванням, а не як описано в документації . Ви можете або змінити типовий або встановити його в пулі додатків. Після цього всі методи Environmentкласу повернуть належні значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.