Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 展开“我的文档”的环境变量_C#_.net_Environment Variables_Environment_Special Folders - Fatal编程技术网

C# 展开“我的文档”的环境变量

C# 展开“我的文档”的环境变量,c#,.net,environment-variables,environment,special-folders,C#,.net,Environment Variables,Environment,Special Folders,我知道我可以读取如下环境变量: Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); Environment.ExpandEnvironmentVariables(@"%MyDocuments%\Foo"); 但是,如果我能做这样的事情,那将对我非常有帮助: Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); Environment.

我知道我可以读取如下环境变量:

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Environment.ExpandEnvironmentVariables(@"%MyDocuments%\Foo");
但是,如果我能做这样的事情,那将对我非常有帮助:

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Environment.ExpandEnvironmentVariables(@"%MyDocuments%\Foo");
是否存在等于SpecialFolder.MyDocuments的环境变量

我也尝试过这样做,但这并没有带来预期的结果:

Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\My Documents\Foo");
这样,我得到了类似于
@“C:\Users\\My Documents\Foo”
的东西,但我需要的是
@“\\someservername\Users$\\My Documents\Foo”

编辑:我的目标不是硬编码环境变量或其后的零件


还有其他建议吗?

我不确定是否有好的方法可以做到这一点,但与其尝试进行环境扩展以获得路径,为什么不使用
路径。请改为使用组合
API

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

你到底想干什么?你有什么理由不能直接使用它吗


您可以使用then
environment.GetEnvironmentVariable
方法展开环境变量。根据您的意见,我建议将您的路径分为两个单独的配置设置,以便于扩展:

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);

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

Start-> run -> cmd
set
set |findstr /i documents
是否存在等于
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);

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

看看,它可能正是你正在寻找的

它允许您执行以下操作:

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

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

您想实现什么?如果它按照您的预期工作,那么上述操作的最终结果会是什么?好的,我想做的是:我想把整个路径放在配置文件中,然后将它扩展到它指向的任何地方。因此,它可以很容易地从@“%appdata%\foo”更改为@“%appdatalocal%\bar”或类似。不硬编码环境变量或其后的部分。我尽量不硬编码特殊文件夹或Foo部分。我尽量避免硬编码路径的任何部分。@wkada好吧,当你将它们硬编码到问题中,并且不提供上下文时,回答问题会很困难。好吧,我更新了/评论了我的问题1提交后一分钟。没想到会立即得到答案:(我的错…不,这并不能解决我的问题。这样做没有问题:Environment.ExpandEnvironmentVariables(“%appdata%\Foo”);但我不知道代表My documents文件夹的环境变量(如果它存在的话)。那么,为什么不自己映射它呢?如果在正常扩展后的路径中找到字符串%mydocuments%(将其与用于大小写的正则表达式匹配),然后将其更改为Environment.SpecialFolder.MyDocuments?如果我可以从配置文件中获取任何路径,展开它并使用它,而无需任何进一步处理,那将是非常棒的。如果它应该是通用的,我必须处理所有没有环境变量的Environment.SpecialFolder枚举成员(或者是相关的一部分)。当然还有其他选择。但如果这能奏效,那将是非常棒的;-)这将是很好的,但那时我们开发人员必须发挥创造性,创建一个对应用程序管理员透明的优雅解决方案……这正是我想要的:)因此我的问题。好的,这就是我需要的。Thanks@HQSnippets那个片段不见了?事实上,整个领域似乎都消失了?真倒霉现在已经不多了