C# получение пути%AppData%

C# 2008 SP1

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

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

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

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

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

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

11 ответов

Решение

Чтобы получить каталог AppData, лучше всего использовать GetFolderPath метод:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

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

Наконец, чтобы создать путь, как показано в вашем примере:

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

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

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

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

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

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

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

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

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

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

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

расширить %AppData% переменная.

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

AppData ⇝ Локальный или (C:\Users\<user>\AppData\Local):

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

AppData ⇝ Роуминг или (C:\Users\<user>\AppData\Roaming):

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Кроме того, может быть полезно знать:

  • Environment.SpecialFolder.ProgramFiles - для папки Program files X64
  • Environment.SpecialFolder.ProgramFilesX86 - для папки Program files X86

Полный список можно посмотреть здесь.

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

пытаться

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

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

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

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

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

string appData = System.Environment.GetEnvironmentVariable("APPDATA");
      Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
Другие вопросы по тегам