2014-05-19 11 views
7

Ich hoffe, dass jemand erklären kann, warum Directory.GetCurrentDirectory() verschiedene Ergebnisse zurückgibt, basierend darauf, wie ich meine Befehlszeilenargumente an die Anwendung übergeben (mit Argumenten einen Ordner auf der app.exe)Directory.GetCurrentDirectory() gibt verschiedene Ergebnisse basierend auf Befehlszeilenargumente zurück

zu springen rechts in denen es dieses Stück Code betrachtet vs ziehen:

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


Wenn Sie erstellen und ausführen dies die Eingabeaufforderung, wie unten dargestellt ist der Ausgang was Sie erwarten würden. Es wird Ausgang das aktuelle Verzeichnis der Anwendung in residiert.

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 


Wenn Sie bauen und dieses Programm ausführen, indem Sie Dateien oder Ordner über die Anwendung Ziehen Sie unterschiedliche Ergebnisse erhalten. Statt das erwartete Ergebnis zurückzugeben, gibt Directory.GetCurrentDirectory() den Pfad zur ersten Datei zurück, die Sie über die Anwendung gezogen haben.


Ich habe derzeit eine Arbeit für dieses Problem, aber ich bin gespannt zu verstehen, warum dies geschieht.

Weitere Informationen:

  • .NET 4.5
  • Windows-2012R2 (Virtual Machine)
  • Volladministratorrechte auf der Maschine

Hoffentlich jemand einen Einblick bieten können.

Antwort

9

Ich denke, das Problem hier ist Ihre Erwartung. Insbesondere dieses Bit:

gibt er das aktuelle Verzeichnis der Anwendung in residiert

Das heißt nicht, was ich von GetCurrentDirectory() erwarten.. Das aktuelle Verzeichnis ist eine Funktion des aufrufenden Kontexts, nicht der Anwendung. Wenn ich die ausführbare Datei über einen vollständigen oder relativen Pfad ausführe (statt nur foo.exe), erwarte ich GetCurrentDirectory(), das Verzeichnis zurückzugeben, das ich in bin - nicht das Verzeichnis, in dem sich die Anwendung befindet. Wenn Dateien darüber gezogen werden: ehrlich gesagt, GetCurrentDirectory() ist weitgehend undefiniert, aber das Verzeichnis der ersten Datei ist nicht unvernünftig.

+4

+1. Es kann nützlich sein, hinzuzufügen, dass, wenn das gewünschte Verhalten ist, den EXE-enthaltenden Ordner zu erhalten, es nützlich sein könnte, Process.GetCurrentProcess() zu nennen. MainModule.FileName oder Assembly.GetExecutingAssembly(). Location, um diese Information zu erhalten. –

+0

Danke Marc. Ich glaube, ich habe das GetDirectory() nicht vollständig verstanden, da ich es nie von außerhalb meiner laufenden Anwendung aufgerufen habe. – Svenkle

2

Ich wette, das Problem ist die Eigenschaft 'Current Directory', die anders ist.

Das aktuelle Verzeichnis gibt Ihnen das aktuelle Arbeitsverzeichnis und nicht die ausführbare Datei.

Wenn Sie & Drop das aktuelle Verzeichnis ziehen wird auf die Quelle gesetzt (die Drag-Quelle) und nicht die Drop-Ziel

4

Wenn Sie auf die ausführbare Datei, eine Datei löschen, wird es aus dem Ort laufen die Datei, die Sie gelöscht haben. Zum Beispiel, wenn Sie C: \ Pfad zu Datei \ Datei.txt auf C: \ Programme \ ApplicationA ablegen.exe es ist wie Sie Folgendes an einer Eingabeaufforderung gemacht haben:

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

Wenn Sie die Anwendung manuell ausführen (im Beispiel oben) Sie die Kontrolle über das Verzeichnis haben es von dem ausgeführt wird, warum es übereinstimmt, was du würdest es erwarten.

Verwandte Themen