【问题标题】:How to get the current working directory of another drive?如何获取另一个驱动器的当前工作目录?
【发布时间】:2019-09-06 02:57:23
【问题描述】:

我需要获取当前驱动器之外的另一个驱动器的当前工作目录。 从阅读答案到 How to get current working directory of another drive in Batch? 我知道此信息存储在由 cmd.exe(或我正在使用的任何 shell)传递给我的进程的环境变量中。但是 C# 类 Environment 似乎无法让我访问这些。

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

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

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

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

【问题讨论】:

  • 我不明白你在做什么。只有一个工作目录...?
  • @John:一个进程只有一个工作目录。但是,每个驱动器号也有一个关联的“当前目录”。 IE。如果在你的命令提示符下你的当前目录在C:驱动器上,并且你输入cd d:\some\sub\directory,你的当前目录仍然是它原来的样子,但是现在如果你通过输入D:来改变你当前的驱动器,你会发现 那个 驱动器上的当前目录设置为\some\sub\directory。这是 DOS/Windows 的一个奇怪的小怪癖,但它确实有效。
  • @Peter 有趣。我不知道!

标签: c# environment-variables


【解决方案1】:

另一个答案很好。但我觉得有点难以理解。您必须对 Windows 及其小怪异了解太多,才能理解它为何起作用。

更直接符合内在 .NET API 的替代方法是使用 System.IO.Path.GetFullPath()。即:

string currentDirectoryForC = Path.GetFullPath("C:");
string currentDirectoryForD = Path.GetFullPath("D:");

GetFullPath() 方法采用以任何有效格式给出的路径,包括上面的相对路径,并将其转换为任何实际的绝对路径,给定一切的当前状态。

恕我直言,关于驱动器号、驱动器的当前目录以及程序的工作目录的全部内容,自 DOS 1.0 以来一直困扰着我(和 CP/M 相关)。 .NET 程序(或任何其他环境中的程序)最好的办法就是始终使用完整路径。

但是,如果您确实需要知道特定驱动器号上的当前目录,则可以使用上述方法。 :)

我还要指出,这两种方法之间存在细微差别:可以从进程中更改当前目录,例如即使程序的工作目录位于C: 驱动器上,也可以执行Environment.CurrentDirectory = @"D:\some\sub\directory"; 之类的操作。但是“魔法环境变量”的值在程序启动时是固定的,因此使用Environment.GetEnvironmentVariable() 技术仍将返回驱动器在程序启动之前的当前目录,而不是新值。

Path.GetFullPath() 方法在这种情况下仍然会做正确的事情,返回该驱动器新设置的当前目录。

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

【讨论】:

  • 我同意使用完整路径,并且我在内部这样做。不幸的是,我收到的输入并不总是完整的路径。 Path.GetFullPath() 方法听起来很适合我的目的。谢谢。
  • @Patrick: “我收到的输入并不总是完整路径” -- 我不确定知道驱动器号的当前目录对那里有什么帮助.任何传递给您的程序的有效路径,您都应该能够直接传递给任何文件 API 并让它弄清楚。如果您需要知道完整路径是什么,您可以直接将该路径传递给Path.GetFullPath() 并让它完成所有工作。您的程序在任何时候都不需要知道驱动器号的当前目录实际上是什么,至少在这些情况下是这样。也许你正在做其他事情?
  • @Patrick 是的,您应该澄清您的用例。这可能是 XY 问题的一个示例。
【解决方案2】:

Environment.GetEnvironmentVariable() 是用于检索环境变量的.NET 方法,我刚刚尝试过这个并观察到它的工作原理与您链接到的那个问题一样:

// Current C: working directory
Environment.GetEnvironmentVariable("=c:")

// Current D: working directory
Environment.GetEnvironmentVariable("=d:")

【讨论】:

  • 噢!我应该考虑尝试的。我确实使用了 Environment.GetEnvironmentVariables() 来查看它们是否会被返回,但它们不是。
  • @Patrick 这可能是因为它们不是实际的环境变量,而是某种“虚拟”环境变量。 Windows shell 有很多这样的东西,你可以用%something% 访问。
猜你喜欢
  • 1970-01-01
  • 2021-05-28
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2013-06-26
相关资源
最近更新 更多