C # получение пути% AppData% - PullRequest
351 голосов
/ 15 мая 2009

C # 2008 SP1

Я использую код ниже:

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

Тем не менее, я получаю исключение, которое указывает на местоположение, из которого запускается мое приложение:

Не удалось найти часть пути 'D: \ Projects \ SubVersionProjects \ CatDialer \ Bin \ Debug \% AppData% \ DateLinks.xml'.

Я думал, что %AppData% должен найти относительный путь. Когда я иду Start|Run|%AppData% Windows Explorer берет меня в этот каталог.

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

Ответы [ 9 ]

730 голосов
/ 15 мая 2009

Чтобы получить каталог 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");
48 голосов
/ 27 июля 2009

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

Не удалось найти ни одно из значений SpecialFolder, которое указывало бы на / App_Data для ASP.NET.

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

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

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

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

28 голосов
/ 14 июня 2013

Способ BEST для использования каталога 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 ). Обычно я не советую людям , а не заново изобретать колесо, но после того, как я впервые пошел другим путем, я понял, что это плохая идея.

22 голосов
/ 15 мая 2009

Вы также можете использовать

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

для расширения переменной %AppData%.

15 голосов
/ 08 апреля 2010

В .net2.0 вы можете использовать переменную Application.UserAppDataPath

6 голосов
/ 15 мая 2009

Я не думаю, что размещение% AppData% в такой строке будет работать.

попробовать

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
3 голосов
/ 28 июня 2015

Просто хотел поделиться другим способом доступа к папке 'App_Data' в моем приложении mvc на тот случай, если это кому-нибудь понадобится.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
1 голос
/ 11 декабря 2018

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

1 голос
/ 28 марта 2018

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

string appData = System.Environment.GetEnvironmentVariable("APPDATA");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...