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");
你到底想干什么?你有什么理由不能直接使用它吗
您可以使用thenenvironment.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那个片段不见了?事实上,整个领域似乎都消失了?真倒霉现在已经不多了