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 Explorer берет меня в этот каталог.

Я не могу указать полный путь, так как пользователь отличается на каждой клиентской машине.

Ответы:


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 для получения этих папок (если только вы не используете пакетные файлы).
Джои

@ Йоханнес: Хорошая информация там. Я только что исправил свой ответ, когда вы его опубликовали, но поясню, что GetFolderPath определенно предпочтительнее, чем ExpandEnvironmentVariable.
Нолдорин

+1 для Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), я был за этим уже пару дней.
Сумит Гош

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

52
К вашему сведению, который предоставляет роуминговый каталог для локального AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)
циклический кризис

49

Путь другой, если вы говорите ASP.NET.

Я не смог найти ни одного значения «SpecialFolder», которое указывало бы на / App_Data для ASP.NET.

Вместо этого вам нужно сделать это:

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

(Примечание: вам не нужно свойство Current в контроллере MVC)

Если есть еще один «абстрактный» способ получить, App_Dataхотел бы услышать, как.


Просто примечание, поскольку сейчас выходит ядро ​​asp.net. Этот подход опирается конкретно на IIS.
Джордж Мауэр

7
HostingEnvironment.MapPath(@"~/App_Data")лучше и работает в контекстах MVC / WebAPI и WCF, где нет HttpContext - но не уверен насчет ядра »
Simon_Weaver

37

Лучший способ использовать каталог 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

Если переменная окружения не установлена, это не ваша вина ( к тому же, когда он IS ). Я обычно не говорю людям не изобретать велосипед, но после того, как я пошел другим путем, я понял, что это плохая идея.


Понравились ваши примеры pathпеременных :)
RBT

+1 Environment.ExpandEnvironmentVariableлучше всего, когда вам просто нужно расширить, независимо от того, какие env переменные могут быть в строке пути.
blins

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")
ajaysinghdav10d

1

Это работает для меня в консольном приложении -

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

1

Для ASP.NET этот Load User Profileпараметр должен быть установлен в пуле приложений, но этого недостаточно. Существует скрытый параметр с именем setProfileEnvironmentin \Windows\System32\inetsrv\Config\applicationHost.config, который по некоторым причинам отключен по умолчанию, а не включен, как описано в документации . Вы можете изменить значение по умолчанию или установить его в своем пуле приложений. Все методы Environmentкласса будут возвращать правильные значения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.