c# - 如何获取另一个驱动器的当前工作目录?
问题描述
我需要获取当前驱动器之外的另一个驱动器的当前工作目录。从阅读 如何批量获取另一个驱动器的当前工作目录的答案? 我知道这些信息存储在 cmd.exe (或我正在使用的任何 shell)传递给我的进程的环境变量中。但是 C# 类 Environment 似乎并没有让我访问这些。
基本上,我正在寻找批处理命令的等效项
w:
cd w:\foo
c:
cd c:\bar
echo %=w:%
在那个例子中,我想得到“w:\foo”,但 Environment.CurrentDirectory 显然会给我“c:\bar”。
我正在寻找类似 Environment.GetCurrentDirectory("w:") 的东西。
解决方案
另一个答案工作正常。但我觉得有点难以理解。您必须对 Windows 及其小怪癖了解太多,才能理解它为何起作用。
更直接符合内在 .NET API 的替代方法是使用System.IO.Path.GetFullPath()
. IE:
string currentDirectoryForC = Path.GetFullPath("C:");
string currentDirectoryForD = Path.GetFullPath("D:");
该GetFullPath()
方法采用以任何有效格式给出的路径,包括上面的相对路径,并将其转换为任何实际的绝对路径,给定所有内容的当前状态。
恕我直言,关于驱动器号、驱动器的当前目录以及程序的工作目录的全部内容,自 DOS 1.0 以来一直困扰着我(以及 CP/M)。.NET 程序(或任何其他环境中的程序)中最好的事情就是始终使用完整路径。
但是,如果你真的需要知道特定驱动器号上的当前目录,上面的方法就可以了。:)
我还要指出,这两种方法之间存在细微差别:可以从进程中更改当前目录,例如,Environment.CurrentDirectory = @"D:\some\sub\directory";
即使程序的工作目录位于C:
驱动器上,也可以这样做。但是“魔法环境变量”的值在程序启动时是固定的,因此使用该Environment.GetEnvironmentVariable()
技术仍将返回驱动器在程序启动之前的当前目录,而不是新值。
在这种情况下,该Path.GetFullPath()
方法仍然会做正确的事情,返回该驱动器的新设置的当前目录。
坦率地说,更改驱动器的当前目录甚至比更改进程的当前工作目录更糟糕,即使人们接受获取当前目录是有意义的。所以我并不是说这是一个非常重要的区别。但它仍然存在,并且可能会影响一个人对使用哪种技术的决定,这取决于如果特定驱动器的进程当前目录发生更改,他们期望发生什么。
推荐阅读
- sql - 在 Where 语句中执行 SQL 查询时出现错误消息
- c# - 由于 TokenValidationParameters,JWT 承载身份验证和授权不起作用
- angular - 从 S3 静态网站提供站点时 Angular 9 Service Worker 无法正常工作
- mysql - Teradata 表创建引发错误:语法错误:预期在“TABLE”关键字和“PUBLIC”关键字之间存在某些内容
- python - 试图为小型 python 程序找到更有效的实现
- python - 将 Python 中的值插入 SQL Server
- php - 如果我在表单中输入了输入数据,提交按钮将不起作用
- excel - 偏移匹配不等于轮换计划的功能
- sql - 编写 PL/SQL 过程
- json - 用于单位转换的 Json 字段依赖