首页 > 解决方案 > 如何获取另一个驱动器的当前工作目录?

问题描述

我需要获取当前驱动器之外的另一个驱动器的当前工作目录。从阅读 如何批量获取另一个驱动器的当前工作目录的答案? 我知道这些信息存储在 cmd.exe (或我正在使用的任何 shell)传递给我的进程的环境变量中。但是 C# 类 Environment 似乎并没有让我访问这些。

基本上,我正在寻找批处理命令的等效项

w:
cd w:\foo
c:
cd c:\bar
echo %=w:%

在那个例子中,我想得到“w:\foo”,但 Environment.CurrentDirectory 显然会给我“c:\bar”。

我正在寻找类似 Environment.GetCurrentDirectory("w:") 的东西。

标签: c#environment-variables

解决方案


另一个答案工作正常。但我觉得有点难以理解。您必须对 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()方法仍然会做正确的事情,返回该驱动器的新设置的当前目录。

坦率地说,更改驱动器的当前目录甚至比更改进程的当前工作目录更糟糕,即使人们接受获取当前目录是有意义的。所以我并不是说这是一个非常重要的区别。但它仍然存在,并且可能会影响一个人对使用哪种技术的决定,这取决于如果特定驱动器的进程当前目录发生更改,他们期望发生什么。


推荐阅读