2013-03-27 18 views
131

Tôi muốn tạo chương trình chuyển đổi tệp. Tôi muốn người dùng có thể đặt tệp thi hành trong bất kỳ thư mục nào và khi thực thi chương trình đó (bấm đúp vào .exe), tôi muốn chương trình xử lý tất cả các tệp trong thư mục hiện tại nơi tệp exe tồn tại. Chương trình có thể xác định đường dẫn mà nó hiện đang thực hiện như thế nào?Nhận đường dẫn thư mục hiện tại

Tôi đã thử System.Windows.Forms.Application.StartupPath nhưng điều đó có vẻ sai.

Bất kỳ ý tưởng nào?

Trả lời

200

Bạn nên không sử dụng Directory.GetCurrentDirectory() trong trường hợp của bạn, vì thư mục hiện tại có thể khác với thư mục thực thi, đặc biệt khi bạn thực hiện chương trình thông qua phím tắt.

Tốt hơn nên sử dụng Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); cho mục đích của bạn. Điều này trả về tên đường dẫn nơi hội đồng hiện đang thi hành.

Trong khi cách tiếp cận đề nghị của tôi cho phép bạn phân biệt giữa hội thi, hội nhập hay lắp ráp tải khác, như Soner Gonul nói trong câu trả lời của mình,

System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

cũng có thể là đủ. Đây sẽ là bằng

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

GetEntryAssembly() và GetExecutingAssembly() có một sự khác biệt thú vị. Để biết chi tiết, hãy tham khảo http://stackoverflow.com/a/18562036/30289 – bhadra

+0

Như tôi đã nói: Điều này trả về tên đường dẫn nơi * hiện đang thực thi assembly * cư trú. Sự khác biệt giữa 'GetEntryAssembly' và' GetExecutingAssembly' không có nhiều bất ngờ, cũng rõ ràng bởi tên hàm. Nếu họ làm như vậy, tại sao nên có hai chức năng? :-) –

+2

+1 Assembly.GetEntryAssembly() đã giúp tôi trong trường hợp chạy ứng dụng thông qua clickonce – Artiom

12

Sử dụng này,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

Bạn có thể sử dụng như là tốt.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
19
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

Từ Path.GetDirectoryName

Trả lại thông tin thư mục cho chuỗi đường dẫn cụ thể.

Từ Application.ExecutablePath

Gets đường dẫn cho tập tin thực thi mà bắt đầu ứng dụng, bao gồm tên thực thi.

6

1.

Directory.GetCurrentDirectory(); 

2.

Thread.GetDomain().BaseDirectory 

3.

Environment.CurrentDirectory 
64
System.AppDomain.CurrentDomain.BaseDirectory 

này sẽ cung cấp cho bạn chạy thư mục của ứng dụng của bạn. Điều này thậm chí làm việc cho các ứng dụng web. Sau đó, bạn có thể truy cập tệp của mình.

+5

Đây là tài sản chính xác nhất để sử dụng cho mục đích này. BaseDirectory của CurrentDomain sẽ luôn trỏ đến vị trí chính xác ngay cả khi AppDomain được tạo động để tìm các assembly từ một vị trí khác. – dhruvin

13

Tôi tạo ra một ứng dụng giao diện điều khiển đơn giản với đoạn mã sau:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); 
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory); 
Console.WriteLine(System.Environment.CurrentDirectory); 
Console.WriteLine(System.IO.Directory.GetCurrentDirectory()); 
Console.WriteLine(Environment.CurrentDirectory); 

tôi sao chép thực thi dẫn đến C:\temp2. Sau đó tôi đặt một phím tắt cho tập tin thực thi đó trong C:\temp3 và chạy nó (một lần từ bản thân exe và một lần từ phím tắt). Nó đã cho các kết quả sau cả hai lần:

C:\temp2 
C:\temp2\ 
C:\temp2 
C:\temp2 
C:\temp2 

Trong khi tôi chắc chắn phải có một lý do nào cockamamie để giải thích lý do tại sao có những năm phương pháp khác nhau mà làm hầu như chính xác những điều đó, tôi chắc chắn don' Tôi biết nó là gì. Tuy nhiên, nó sẽ xuất hiện trong hầu hết các trường hợp, bạn được tự do lựa chọn cái nào bạn ưa thích.

CẬP NHẬT: Tôi đã sửa đổi thuộc tính Shortcut, thay đổi trường "Bắt đầu trong:" thành C:\temp3. Điều này dẫn đến kết quả như sau:

C:\temp2 
C:\temp2\ 
C:\temp3 
C:\temp3 
C:\temp3 

... mà chứng tỏ ít nhất một số của sự phân biệt giữa các phương pháp khác nhau.

+0

Cảm ơn bạn rất nhiều. – baj9032