С#, путь к% AppData%

С# 2008 SP1

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

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

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

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

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

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

Ответ 1

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(необходимо добавить using System если не присутствует).

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

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

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

Ответ 2

Путь отличается, если вы говорите об ASP.NET.

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

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

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

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

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

Ответ 3

BEST способ использования каталога AppData IS для использования метода Environment.ExpandEnvironmentVariable. p >

Причины:

  • он заменяет части вашей строки действительными каталогами и т.д.
  • нечувствителен к регистру
  • легко и без проблем
  • это стандартный
  • подходит для работы с пользователем

Примеры:

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

Ответ 4

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

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

чтобы развернуть переменную %AppData%.

Ответ 5

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

Ответ 6

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

попробовать

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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