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 X64Environment.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);