Разверните переменную среды для Моих Документов - PullRequest
12 голосов
/ 18 января 2011

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

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

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

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

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

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

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

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

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

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

Ответы [ 6 ]

11 голосов
/ 18 января 2011

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

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

Это позволяет вам сделать что-то подобное:

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

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

7 голосов
/ 18 января 2011

Существует ли переменная окружения, равная 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);
1 голос
/ 18 января 2011

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

Start-> run -> cmd
set
set |findstr /i documents
1 голос
/ 18 января 2011

Вы можете расширить переменные окружения, используя метод 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);
1 голос
/ 18 января 2011

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

string docs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string foo = Path.Combine(docs, "Foo");
1 голос
/ 18 января 2011

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

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