2014-05-19 98 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 
    

    當您手動運行該應用程序(在你上面的例子),你就在它的運行目錄控制來自這就是爲什麼它匹配什麼你會期望的。

    相關問題