Nhận đường dẫn thư mục hiện tại


222

Tôi muốn tạo một chương trình chuyển đổi tập tin. Tôi muốn người dùng có thể đặt tệp thực thi trong bất kỳ thư mục nào và khi thực hiện chương trình đó (nhấp đú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 . Làm thế nào chương trình có thể xác định đường dẫn mà nó hiện đang thực hiện?

Tôi đã cố gắng System.Windows.Forms.Application.StartupPathnhưng dường như đó là cách sai.

Có ý kiến ​​gì không?

Câu trả lời:


334

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

Tốt hơn là 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 tập hợp hiện đang thực thi.

Trong khi phương pháp đề xuất của tôi cho phép bạn phân biệt giữa lắp ráp thực thi, lắp ráp nhập cảnh hoặc bất kỳ lắp ráp được tải nào khác, như Soner Gönül đã nói trong câu trả lời của mình,

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

cũng có thể là đủ Điều này sẽ bằng

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

10
GetEntryAssugging () và GetExecutingAssugging () có một sự khác biệt thú vị. Để biết chi tiết tham khảo stackoverflow.com/a/18562036/30289
bhadra

3
Như tôi đã nói: Điều này trả về tên đường dẫn nơi tập hợp hiện đang thực thi . Sự khác biệt giữa GetEntryAssemblyGetExecutingAssemblykhông gây ngạc nhiên nhiều, cũng rõ ràng bởi tên hàm. Nếu họ làm như vậy, tại sao phải có hai chức năng? :-)
Thorsten Dittmar


9
Đây là trong System.Reflection, vậy System.Reflection.Assembly.GetExecutingAssembly().Locationlà hoàn tất - nếu bạn đang thử nghiệm từ Cửa sổ ngay lập tức
The Red Pea

147
System.AppDomain.CurrentDomain.BaseDirectory

Điều này sẽ cung cấp cho bạn thư mục chạy ứng dụng của bạn. Điều này thậm chí hoạt động cho các ứng dụng web. Sau đó, bạn có thể đạt được tập tin của bạn.


9
Đâ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 đúng vị trí ngay cả khi AppDomain được tạo động để xem các cụm từ một vị trí khác.
dhruvin

Hoàn hảo. Điều này hoạt động độc lập cho bất kỳ ứng dụng nào, đặc biệt là khi sử dụng Streamreader, có thể đọc các đường dẫn tuyệt đối khác nhau tùy thuộc vào loại ứng dụng.
dùng326078

40

Tôi đã tạo một ứng dụng giao diện điều khiển đơn giản với 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 kết quả thực thi vào C:\temp2. Sau đó, tôi đã đặt một lối tắt đến tệp thực thi đó C:\temp3và chạy nó (một lần từ chính exe và một lần từ phím tắt). Nó đã cho các đầu ra sau cả hai lần:

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

Mặc dù tôi chắc chắn phải có một số lý do cockamamie để giải thích tại sao có năm phương pháp khác nhau thực hiện gần như chính xác cùng một thứ, tôi chắc chắn không biết nó là gì. Tuy nhiên, trong hầu hết các trường hợp, có vẻ như bạn có thể tự do chọn bất cứ thứ gì bạn thích.

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

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

... trong đó thể hiện ít nhất một số điểm khác biệt giữa các phương pháp khác nhau.


2
Cảm ơn rât nhiều.
baj9032

Một lưu ý quan trọng. Thư mục làm việc không phải lúc nào cũng giống với thư mục đã cài đặt.
Jordan


21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

Từ Path.GetDirectoryName

Trả về thông tin thư mục cho chuỗi đường dẫn đã chỉ định.

Từ Application.ExecutablePath

Nhận đường dẫn cho tệp thực thi đã khởi động ứng dụng, bao gồm cả tên thực thi.


19

Dùng cái này,

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

Bạn có thể sử dụng điều này là tốt.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

9

để sử dụng .NET CORESystem.AppContext.BaseDirectory

(thay thế cho AppDomain.CurrentDomain.BaseDirectory)


6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory

Environment.CurrentDirectorycó thể được thay đổi theo một số cách ... (cài đặt shotrtcut, v.v.)
Yousha Aleayoub 16/11/19


0

Nếu bạn muốn đường dẫn exe bạn có thể sử dụng System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

Điều này hoạt động tốt nhất đối với tôi, đặc biệt là khi sử dụng xuất bản tập tin lõi đơn dotnet. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.