13

我知道我可以像这样读取环境变量:

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

编辑:我的目标不是硬编码环境变量或之后的部分。

还有其他建议吗?

4

6 回答 6

11

不,特殊文件夹没有环境变量(枚举MyDocuments的大多数成员也是如此)。SpecialFolder

查看此代码段,它可能正是您要搜索的内容。

它允许您执行以下操作:

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

注意:SpecialFolder.ExpandVariables 是上述代码片段中介绍的辅助类的静态方法。

于 2011-01-18T20:06:11.223 回答
9

是否存在等于的环境变量SpecialFolder.MyDocuments

简短的回答:没有。

长答案:
仍然没有。您可以键入"set"命令提示符以查看所有当前环境变量。我在我的个人资料中找不到我的文档文件夹(在 WinXP 和 Win7 上尝试过)。

此外,扩展"%USERPROFILE%\My Documents"是不正确的,因为用户的文档文件夹可能在其他任何地方(例如,在我的家用 PC 上,我总是将我的文件夹更改为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);
于 2011-01-18T18:10:19.027 回答
2

你到底想做什么?有什么理由不能使用Path.Combine吗?

string docs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string foo = Path.Combine(docs, "Foo");
于 2011-01-18T17:09:08.620 回答
1

我不确定是否有一种好方法可以做到这一点,但与其尝试进行环境扩展来获取路径,为什么不使用Path.CombineAPI 来代替呢?

Path.Combine(
  Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
  "Foo");
于 2011-01-18T17:08:50.447 回答
1

Environment.GetEnvironmentVariable您可以使用 then方法扩展环境变量。鉴于您的评论,我建议您将路径分成 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);
于 2011-01-18T17:15:54.580 回答
1

不,它不存在。最简单的检查方法是从命令行运行“set”并查看自己。

Start-> run -> cmd
set
set |findstr /i documents
于 2011-01-18T17:50:54.910 回答