Развернуть переменную окружения для My Documents

Я знаю, что могу читать переменные среды следующим образом:

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Однако мне было бы очень полезно, если бы я мог сделать что-то вроде этого:

Environment.ExpandEnvironmentVariables(@"%MyDocuments%\Foo");

Есть ли переменная environement, которая равна SpecialFolder.MyDocuments?

Я также пытался сделать что-то подобное, но это не приводит к ожидаемому результату:

Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\My Documents\Foo");

Таким образом, у меня получилось что-то вроде @"C:\Users\<MyUser>\My Documents\Foo", но мне нужно то, что мне нужно @"\\someservername\users$\<MyUser>\My Documents\Foo".

РЕДАКТИРОВАТЬ: Моя цель - не жестко указывать ни переменную среды, ни часть после этого.

Любые другие предложения?

Ответ 1

Нет никакой переменной среды для специальной папки MyDocuments (то же самое верно для большинства членов перечисления SpecialFolder).

Отметьте этот фрагмент, это может быть именно то, что вы ищете.

Это позволяет вам сделать что-то вроде этого:

string fullPath = SpecialFolder.ExpandVariables(@"%MyDocuments%\Foo");

Примечание. SpecialFolder.ExpandVariables - это статический метод класса-помощника, введенный в приведенном выше фрагменте.

Ответ 2

Есть ли переменная среды, равная SpecialFolder.MyDocuments?

Короткий ответ: Нет

Длинный ответ:
Все еще нет. Вы можете ввести "set" в Командную строку, чтобы увидеть все текущие переменные среды. Я не смог найти какую-либо папку для своих документов в своем профиле (попробовал WinXP и Win7).

Кроме того, расширение "%USERPROFILE%\My Documents" было бы неверным, так как папка документов пользователя могла быть где-нибудь еще (например, на моем домашнем ПК я всегда меняю свою на D:\Documents).

Если вам действительно нужно использовать переменные среды, одним из решений может быть установка самой переменной:

// this environment variable is created for the current process only
string documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Environment.SetEnvironmentVariable("MYDOCUMENTS", documents);

Другим решением может быть использование "поддельной" переменной среды в пути и ее расширение самостоятельно, например:

string path = "%MYDOCUMENTS%\\Foo"; // read from config

// expand real env. vars
string expandedPath1 = Environment.ExpandEnvironmentVariables(path);

// expand our "fake" env. var
string documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string expandedPath2 = path.Replace("%MYDOCUMENTS%", documents);

Ответ 3

Я не уверен, что есть хороший способ сделать это, но вместо того, чтобы пытаться сделать расширение среды, чтобы получить путь, почему бы не использовать API Path.Combine вместо этого?

Path.Combine(
  Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
  "Foo");

Ответ 4

Что именно вы пытаетесь сделать? Есть ли причина, по которой вы не можете просто использовать Path.Combine?

string docs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string foo = Path.Combine(docs, "Foo");

Ответ 5

Вы можете расширить переменные среды, используя метод Environment.GetEnvironmentVariable. Учитывая ваш комментарий, я предлагаю разбить свой путь на 2 отдельные настройки конфигурации, чтобы упростить его расширение:

string variablePath = "%appdata%".Trim('%'); //read from some config setting
string appdataPath = Environment.GetEnvironmentVariable(variablePath);
string subdir = "foo";  //some other config setting
string myDir = Path.Combine(appdataPath, subdir);

Ответ 6

Нет, этого не существует. Самый простой способ проверить - запустить "set" из командной строки и увидеть себя.

Start-> run -> cmd
set
set |findstr /i documents