2014-05-19 304 views
7

我希望有人可以解释为什么Directory.GetCurrentDirectory()根据我如何将我的命令行参数传递给应用程序返回不同的结果(使用args下面的输出是如图所示Directory.GetCurrentDirectory()根据命令行参数返回不同的结果

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(); 
    } 
} 


如果你建立和使用命令提示符运行以下命令:VS在APP.EXE)拖动一个文件夹

直接进入它认为这一段代码你期望什么。它将输出的应用程序驻留在当前目录中。

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(虚拟机)的机器

  • 完全管理员权限希望有人能提供一些见解。

  • 回答

    9

    我认为这里的问题是你的期望。特别是,该位:

    它会输出当前目录下的应用程序驻留在

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

    +4

    +1。如果需要的行为是获取EXE的包含文件夹,可能会有用处,可能会提到使用Process.GetCurrentProcess()。MainModule.FileName或Assembly.GetExecutingAssembly()。Location来获取该信息。 –

    +0

    谢谢马克。我想我没有完全理解GetDirectory(),因为我从未在我的运行应用程序之外真正调用它。 – Svenkle

    2

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

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

    当你当上可执行拖放文件拖到&删除当前目录设置为源(拖动源),而不是放置目标

    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 
    

    当您手动运行该应用程序(在你上面的例子),你就在它的运行目录控制来自这就是为什么它匹配什么你会期望的。

    相关问题