С#, путь к% 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
будут возвращать правильные значения.