2012-06-12 32 views
41

tôi đã cố gắng để có được những thư mục của ứng dụng giao diện điều khiển sử dụng mã dưới đây,Làm thế nào để có được thư mục thực hiện các ứng dụng giao diện điều khiển

Assembly.GetExecutingAssembly().Location 

nhưng điều này mang lại cho tôi nơi lắp ráp cư trú. Điều này có thể khác với nơi tôi đã thực thi ứng dụng.

Ứng dụng bảng điều khiển của tôi phân tích nhật ký không có tham số. Nó phải đi đến thư mục logs/ bên trong thư mục của tệp thi hành hoặc nếu tôi cung cấp cho nó đường dẫn đến logs/ nó sẽ phân tích cú pháp đó.

+0

Có xem xét câu hỏi này: http://stackoverflow.com/questions/ 674857/should-i-use-appdomain-currentdomain-basedirectory-hoặc-system-environment-current – Karsten

Trả lời

69

Sử dụng Environment.CurrentDirectory.

Tìm hoặc đặt đường dẫn đầy đủ của thư mục làm việc hiện tại.
(MSDN Environment.CurrentDirectory Property)

string logsDirectory = Path.Combine(Environment.CurrentDirectory, "logs"); 

Nếu ứng dụng của bạn đang chạy trong c: \ Foo \ BarlogsDirectory sẽ trỏ đến c: \ Foo \ bar \ logs.

+15

Thư mục hiện tại khác với direc tory chứa tệp thực thi hiện tại. – KFL

+0

Environment.CurrentDirectory là một giá trị có thể và sẽ thay đổi thông qua quá trình chạy ứng dụng của bạn. Ví dụ, bằng cách sử dụng các tham số mặc định, OpenFileDialog trong WinForms sẽ thay đổi giá trị này thành thư mục mà tệp được chọn từ –

6

cách an toàn nhất:

string temp = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); 
+3

CodeBase là một URL đến nơi tệp được tìm thấy, trong khi Vị trí là đường dẫn từ nơi nó thực sự nạp vào. Ví dụ, nếu hội đồng được tải xuống từ internet, CodeBase của nó có thể bắt đầu bằng "http: //", nhưng Vị trí của nó có thể bắt đầu bằng "C: \". Nếu tệp đã được sao chép bóng, Vị trí sẽ là đường dẫn đến bản sao của tệp trong thư mục sao chép bóng. Bạn cũng nên biết rằng CodeBase không được bảo đảm được đặt cho các hội đồng trong GAC. Tuy nhiên, vị trí sẽ luôn được đặt cho các assembly được nạp từ đĩa. –

+0

Chắc chắn rằng tập tin nằm trên đĩa, tôi sử dụng phiên bản này để có được một đường dẫn "thông thường" thay vì một đường dẫn 'file: //': 'Path.GetDirectoryName (new Uri (this.GetType(). Assembly.GetName() .CodeBase) .LocalPath) ' – Timo

16

Sử dụng này:

System.Reflection.Assembly.GetExecutingAssembly().Location 

Kết hợp với

System.IO.Path.GetDirectoryName if all you want is the directory. 
+2

[Source] (http://stackoverflow.com/a/837501/397322) – William

+0

Nếu tôi sử dụng Environment.CurrentDirectory chạy theo Scheduled Task, nó sẽ đi tới C: \ Windows \ system32 \ log không phải là đường dẫn thực hiện. Sau đó, tôi sử dụng System.Reflection.Assembly.GetExecutingAssembly() này, nó trỏ đến đường dẫn thực thi exe chính xác của tôi. Cảm ơn! – LifeiSHot

+0

Điều này có thể không hoạt động như bạn hy vọng trong các bài kiểm tra đơn vị hoặc dự án web chạy IIS cục bộ. Câu trả lời 'CodeBase'. – Timo

Các vấn đề liên quan