2009-08-03 31 views
59

Từ chương trình a.exe nằm trong c:/dir Tôi cần mở tệp văn bản c: /dir/text.txt. Tôi không biết vị trí của a.exe, nhưng text.txt sẽ luôn nằm trong cùng một đường dẫn. Làm thế nào để có được tên của hội đồng hiện đang thực hiện từ bên trong đến chương trình riêng của mình để tôi có thể truy cập tệp văn bản?Cách tốt nhất để có được đường dẫn exe thực thi trong .NET là gì?

EDIT: nếu a.exe là dịch vụ Windows thì sao? Nó không có ứng dụng vì nó không phải là một ứng dụng Windows.

Xin cảm ơn trước.

Trả lời

117

tôi thường truy cập vào thư mục chứa .exe ứng dụng của tôi với:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 
+2

Tôi cũng vậy, và đã nhìn thấy các câu trả lời khác bây giờ tôi cảm thấy như tôi đã bị mất một thủ thuật! –

+3

+1; Nên được GetEntryAssembly mặc dù. – weiqure

+0

@ weiqure- đó là một điểm tốt. – RichardOD

13
string exePath = Application.ExecutablePath; 
string startupPath = Application.StartupPath; 

EDIT - Không cần sử dụng đối tượng áp dụng:

string path = System.IO.Path.GetDirectoryName( 
     System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 

Xem ở đây để biết thêm:

http://msdn.microsoft.com/en-us/library/aa457089.aspx

+3

Chỉ muốn chỉ ra rằng loại ứng dụng 'nằm trong không gian tên' System.Windows.Forms' - xem: http://msdn.microsoft.com/en-us/library/system. windows.forms.application.startuppath (v = vs.110) .aspx –

4

Lấy lắp ráp bạn quan tâm (ví dụ. gán cho một biến System.Reflection.Assembly a):

  • System.Reflection.Assembly.GetEntryAssembly(), hoặc
  • typeof(X).Assembly cho một lớp X đó là trong lắp ráp bạn quan tâm (đối với Windows Forms bạn có thể sử dụng typeof(Program))

Sau đó nhận được đường dẫn nơi tệp được lắp ráp a được tải từ:

  • System.IO.Path.GetDirectoryName(a.Location)

Đối tượng Application từ ứng dụng Windows Forms cũng là một khả năng, như được giải thích trong các câu trả lời khác.

-4
MessageBox.Show("This program is located in: " + Environment.CurrentDirectory); 
+21

Vì bạn đã bị bỏ phiếu (không phải bởi tôi), bạn có thể muốn biết tại sao. Thuộc tính thư mục hiện tại có thể được đặt trong mã, do đó, điều này có thể thay đổi. Điều này cũng có thể khác nếu ứng dụng được bắt đầu từ một phím tắt. – Kleinux

+6

Cảm ơn bạn đã bình luận. Và lời giải thích :-) –

+0

Đối với bất cứ ai nhìn thấy điều này trong tương lai, chúng ta hãy đồng ý giữ điều này ở đây như một ví dụ về những gì không nên thử và tại sao, và chúng ta hãy đồng ý để trả lời câu trả lời khiêm nhường của jay ít nhất là số lần bị downvoted , vì ít nhất anh nhận ra lý do, bây giờ, nó không hoạt động. :) – vapcguy

0

sử dụng câu trả lời của peSHlr cũng hoạt động tốt khi thử nghiệm ở NUnit.

var thisType = typeof(MyCustomClass); 

var codeLocation = Path.GetDirectoryName(thisType.Assembly.Location); 

var codeLocationPath = Path.GetDirectoryName(codeLocation); 

var appConfigPath = Path.Combine(codeLocationPath, "AppConfig"); 
Các vấn đề liên quan