2011-01-18 4 views
11

Я знаю, я могу читать переменные окружения, как это:Расширьте переменные среды для Моих документов

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".

EDIT: Моя цель - не жестко кодировать ни переменную среды, ни деталь после этого.

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

+0

Что вы пытаетесь достичь? Каков был бы конечный результат выше, если бы он работал так, как вы ожидали? –

+0

ОК, что я пытаюсь сделать, это: я хочу поместить весь путь в файл конфигурации и просто расширить его до того, на что он указывает. Поэтому он может легко измениться с @% appdata% \ foo на @ "% appdatalocal% \ bar" или аналогичный. Не hardcoding ни переменная среды, ни часть после этого. – wkada

ответ

11

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

Отъезд this snippet, это может быть именно то, что вы ищете.

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

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

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

+0

Хорошо, это то, что мне нужно. Спасибо – wkada

+5

@HQSnippets, что этот фрагмент исчез? На самом деле весь домен пропал? http://www.whois.net/whois/hqsnippets.net –

+0

Bummer. Не так много осталось в [Wayback Machine] (http://web.archive.org/web/*/http://hqsnippets.net/*) –

1

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

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

Я стараюсь избегать жесткого кодирования любой части пути. – wkada

+2

@wkada хорошо, когда вы жестко кодируете их в вопрос и не предоставляете контекст, это затрудняет ответ на вопрос. – JaredPar

+0

Ну, я обновил/прокомментировал мой вопрос через минуту после отправки. Не ожидал ответа сразу :(Мой плохой ... – wkada

1

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

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

Я стараюсь не жестко кодировать специальную папку или часть Foo. – wkada

1

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

Нет, это не решает мою проблему. Нет проблем делать что-то вроде этого: Environment .ExpandEnvironmentVariables («% appdata% \ Foo»), но я не знаю переменную среды, которая соответствует папке моих документов (если она вообще существует). – wkada

+1

Тогда почему бы просто не наброситься на нее самостоятельно, если вы найдете строку % mydocuments% в пути после нормального расширения (сопоставьте его с регулярным выражением для оболочки), а затем измените его на Environment.SpecialFolder.MyDocuments? –

+0

Было бы здорово, если бы я мог взять любой путь из файла конфигурации, развернуть его и использовать он без какой-либо дальнейшей обработки. И если он должен быть универсальным, мне пришлось обрабатывать каждый член перечисления Environment.SpecialFolder, у которого нет такой переменной среды (или подмножество из них, которое имеет значение). Конечно, есть другие er. Но если бы это сработало, это было бы блестяще ;-) – wkada

1

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

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

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

Короткий ответ: No.

Длинный ответ:
до сих пор нет. Вы можете ввести "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); 

 Смежные вопросы

  • Нет связанных вопросов^_^