Directory.GetCurrentDirectory()根据命令行参数返回不同的结果

时间:2014-05-19 09:36:04

标签: c# .net .net-4.5 command-line-arguments

我希望有人可以解释为什么 Directory.GetCurrentDirectory()会根据我将命令行参数传递给应用程序的方式返回不同的结果(使用args运行vs将文件夹拖过APP.EXE)

要直接进入它,请考虑以下代码:

 public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("The current directory is {0}", Directory.GetCurrentDirectory());

        if(args != null && args.Any())
            Console.WriteLine("Command line arguments are {0}", String.Join(", ", args));

        Console.ReadLine();
    }
}


如果您使用命令提示符构建并运行它,如下所示,则输出是您所期望的。它将输出应用程序所在的当前目录。

C:\Projects\ArgumentTest\ApplicationA\bin\Debug\ApplicationA.exe C:\mydirectory
The current directory is C:\Projects\ArgumentTest\ApplicationA\bin\Debug\
Command line arguments are C:\mydirectory


如果通过在应用程序上拖动文件或文件夹来构建和运行此程序,则会得到不同的结果。而不是返回预期的结果而不是Directory.GetCurrentDirectory()返回您在应用程序上拖动的第一个文件的路径。


我现在有一个解决这个问题的方法,但我很想知道为什么会这样。

其他信息:

  • .NET 4.5
  • Windows 2012R2(虚拟机)
  • 计算机的完全管理员权限

希望有人可以提供一些见解。

3 个答案:

答案 0 :(得分:9)

我认为这里的问题是你的期望。特别是这一点:

  

它将输出应用程序所在的当前目录。

我对GetCurrentDirectory()的期望。当前目录是调用上下文的一个功能,而不是应用程序。如果我通过完整或相对路径(而不仅仅是foo.exe)运行可执行文件,我希望GetCurrentDirectory()返回我在中的目录 - 而不是目录应用程序在。在将文件拖过它的情况下:坦率地说,GetCurrentDirectory()在很大程度上是未定义的,但第一个文件的目录并非不合理。

答案 1 :(得分:4)

当您将文件拖放到可执行文件时,它将从您删除的文件的位置运行它。例如,如果将C:\ Path-To-File \ File.txt放到C:\ Program \ ApplicationA.exe上,就像从命令提示符处完成以下操作一样:

cd C:\Path-To-File
C:\Program\ApplicationA.exe C:\Path-To-File\File.txt

当您手动运行应用程序时(在上面的示例中),您可以控制它正在运行的目录,这就是它与您期望的匹配的原因。

答案 2 :(得分:2)

我打赌问题是“当前目录”属性不同。

当前目录为您提供当前工作目录,而不是可执行文件的位置。

当您拖放时,当前目录设置为源(拖动源)而不是放置目标