【问题标题】:Command line current working directory in a console app [duplicate]控制台应用程序中的命令行当前工作目录[重复]
【发布时间】:2012-11-27 15:09:32
【问题描述】:

可能重复:
How do I find out what directory my console app is running in with C#?

如何获取运行程序的控制台的当前工作目录,以便我可以解析作为程序参数传递的相对路径?

假设我把我的程序放在这里:c:\tools\program.exe 但我从不同的地方调用它。假设我在这里:C:\Users\Me\Documents\ 我运行这个命令program.exe --src=somefile.txt --dest=subdir\otherfile.txt

Environment.CurrentDirectorySystem.Reflection.Assembly.GetExecutingAssembly().Location 将返回 c:\tools 但我希望能够解析与 C:\Users\Me\Documents\ 相关的 somefile.txtsubdir\oterfile.txt 路径。

====== 更新 ======

感谢您的帮助。 Environment.CurrentDirectory 似乎按预期工作。事实证明,在我的情况下,问题是由 Xenocode 的 Postbuild 工具(现在称为 Spoon Virtual Application Studio)引起的,我偶尔会使用该工具将所有程序文件(包括 dll、配置等)“打包”到一个可执行文件中。它非常方便,但在这种情况下,“虚拟化”功能搞砸了我程序的 Environment 变量。我已经设法解决了这个问题。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/275689/….
  • 好吧,如果那些文件像参数一样过去,可能是简单的解决方案只是保存过去的路径,或者不?
  • 你是如何调用 exe 的?是否设置了路径环境变量?
  • @PanosRontogiannis - 是的,我已经设置了 PATH 变量,所以我不必每次都输入完整的程序路径。
  • 您是从命令提示符手动调用它,还是从 C# 程序以编程方式调用它?

标签: c# windows console


【解决方案1】:

Environment.CurrentDirectory 为您提供当前工作目录

让我举一个简单的例子:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Startup: " + Environment.CurrentDirectory);
        Environment.CurrentDirectory = @"D:\temp";
        Console.WriteLine("After:" + Environment.CurrentDirectory);
    }
}

现在我创建了两个文件夹,分别命名为 D:\tempD:\temp2
我把可执行文件放在D:\temp
打开命令提示符并将当前工作目录设置为cd D:\temp2
从那个目录我运行..\temp\mytestapp.exe

输出是

Startup: D:\temp2
After: D:\temp

出于好奇:

这是 Net 1.1 中Environment.CurrentDirectory 的文档

获取并设置当前目录的全限定路径;那 是,这个进程开始的目录。

这是 NET 4.0 中的文档

获取或设置当前工作的全限定路径 目录。

【讨论】:

  • 我不明白。以你的例子我得到Startup: D:\temp。请注意,我不会通过提供可执行文件的完整路径来运行程序 - 我已将 PATH 变量设置为指向可执行文件所在的目录。
  • 再次测试,这次我将 PATH 变量设置为 d:\temp 并将命令提示符移到另一个目录。从这个其他目录运行(不提供部分路径)它会打印这个其他目录的名称,然后更改为 d:\temp.
  • 对不起,您是对的 - 请参阅我的编辑了解详细信息。
【解决方案2】:

使用EnvironmentPath 类。 http://msdn.microsoft.com/en-us/library/fyy7a5kt.aspx

var fqn = Path.Combine(Environment.CurrentDirectory, "somefile.txt")

但是要处理您需要的文档:

var fqn = Path.Combine(
     Environment.GetFolderPath(Environment.SpecialFolder.Person),
     "somefile.txt");

`fqn' 是完全限定名称的 TLA

【讨论】:

  • Environment.CurrentDirectory 返回可执行文件所在的路径,在我的例子中是`c:\tools`。 “我的文档”只是一个例子——我无法对其进行硬编码。
  • 我不这么认为,Environment.CurrentDirectory 给出了当前工作目录
  • @Steve - 我已经测试过了。在我的情况下,Environment.CurrentDirectory 返回c:\tools。那是可执行文件所在的位置。但我不在乎那条路。我想知道命令行当前目录——用户运行程序时所在的目录。
  • OP 有两个问题合二为一!首先如何在“当前目录”中获取文件。其次如何获取My Documents文件夹中的文件。
  • CurrentDirectory 始终是调用程序时用户所在的位置。它与 ystem.Reflection.Assembly.GetExecutingAssembly().Location 不同,除非有其他阻碍!
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
相关资源
最近更新 更多