Lấy thư mục của ứng dụng từ ứng dụng WPF


170

Tôi đã tìm thấy các giải pháp cho Windows Forms với AppDomain nhưng điều gì sẽ tương đương với một Applicationđối tượng WPF ?

Câu trả lời:


329

Một phương pháp:

System.AppDomain.CurrentDomain.BaseDirectory

Một cách khác để làm điều đó sẽ là:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

À, cảm ơn. Phải bỏ qua AppDomain bằng cách nào đó. Tôi đang tìm nó, thực sự ...
Joey

3
@Helen: Đánh giá từ các upvotes, đây rõ ràng là một câu trả lời tuyệt vời. Tuy nhiên, câu trả lời có hai cách để nhận được thư mục ứng dụng. Cả hai sẽ làm việc tốt như nhau?
Christoffer Lette

21
Tôi sẽ sử dụng thay thế đầu tiên. Nó trông đơn giản hơn, không có một cuộc gọi phương thức và gây ra ít nghi ngờ về những gì dòng thực sự làm khi đọc.
Filip

3
Tôi đã sử dụng phương thức đầu tiên trong dịch vụ WCF, trong Ứng dụng WPF và trong dự án Thư viện lớp và hoạt động tốt.
Apostrofix

1
Đối với NetCore và NetSt Chuẩn, tôi muốn giới thiệu cái thứ hai, vì AppDomain đã được thêm vào 2.0 và không thể luôn được đặt như mong đợi
cdie

28

Đây là một:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
Cái này có được vị trí sau khi sao chép bóng , như đã nêu trong các tài liệu . Tôi thực sự không chắc chắn nếu các đề xuất trong câu trả lời được chấp nhận có bị ảnh hưởng bởi sao chép bóng hay không.
Christoffer Lette

2
Điều này đã cho tôi thư mục con của DLL tôi đang gọi, không phải thư mục chương trình chính.
strattonn

7

Bạn cũng có thể sử dụng đối số đầu tiên của các đối số dòng lệnh:

String exePath = System.Environment.GetCommandLineArgs()[0]


1
Tuy nhiên, lưu ý rằng một ứng dụng "ác" có thể sửa đổi các đối số dòng lệnh của nó.
Daniel Rose

@Daniel: Tại sao nó sẽ làm điều đó với chính nó? Hay bạn có nghĩa là một ứng dụng khác nhau?
Merlyn Morgan-Graham

1
@Merlyn: Xem blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx tôi sẽ báo giá: "Tham số thuận tiện khởi tạo mã khởi động của quá trình" nó là một Vì vậy, bạn có thể cố tình hoặc vô tình sửa đổi vị trí bộ nhớ đó.
Daniel Rose

1
@Daniel: Ai có thể? Một quá trình khác, hay quá trình tương tự? Nếu bạn tự bắn vào chân mình, nó sẽ dễ dàng theo dõi. Tôi gọi điều đó ít tệ hơn và ngu ngốc hơn :) Nếu một quá trình khác có thể làm điều đó, thì điều đó thú vị hơn. Chỉnh sửa: Tôi không thấy bất cứ điều gì trong bài viết đó về việc sửa đổi dòng lệnh của chương trình đang chạy - chỉ có quá trình khởi chạy vượt qua nó (không chắc chắn rằng quá trình khởi chạy để thay đổi dòng lệnh) là điều không mong muốn và bạn có thể truy vấn nó thông qua WMI.
Merlyn Morgan-Graham

@ MerlynMorgan-Graham một ứng dụng độc hại có thể sửa đổi địa chỉ bộ nhớ và buộc ứng dụng của bạn chạy một ứng dụng độc hại khác thay thế. Điều này là xấu, bởi vì hãy nói rằng ứng dụng của họ là một keylogger và họ muốn nó kích hoạt ngay khi bạn mở một ứng dụng riêng biệt. Vì vậy, trong mã của họ, họ sẽ nắm bắt tên ứng dụng của bạn, chạy keylogger của họ trong nền và sau đó chạy ứng dụng của bạn. Người dùng sẽ không biết gì. Bài báo không giải thích điều này, nhưng nó không cho bạn biết cách thực hiện. Có lẽ đó là những gì bạn đang tìm kiếm?
pqsk

6

Tôi đã sử dụng đơn giản string baseDir = Environment.CurrentDirectory;và công việc của nó cho tôi.

Chúc may mắn

Biên tập:

Tôi đã từng xóa loại lỗi này nhưng tôi thích chỉnh sửa nó vì tôi nghĩ rằng điểm trừ trong câu trả lời này giúp mọi người biết về cách sai. :) Tôi hiểu giải pháp trên không hữu ích và tôi đã thay đổi nó thành string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; các cách khác để có được nó là:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

Chúc may mắn


3
Đó là thư mục làm việc hiện tại. Nó có thể trùng với thư mục ứng dụng nhưng đó là những khái niệm riêng biệt (và quan trọng nhất là thư mục làm việc có thể thay đổi, ví dụ nếu bạn có một hộp thoại tệp chung mở).
Joey

1
@joey bạn nói đúng. Tôi đã thay đổi nó thành này: chuỗi appBaseDir = System.AppDomain.CienDomain.BaseDirectory; Cảm ơn.
QMaster

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Thử cái này!


3

Thử cái này. Đừng quên using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

Tôi đã thử điều này:

    label1.Content = Directory.GetCurrentDirectory();

và nhận được thư mục.


Điều này nhận được thư mục làm việc hiện tại, có thể khác với thư mục quá trình.
Thraka

Tôi đoán tôi phải đánh giá Directory.GetCienDirectory (); hơn. Cảm ơn bạn @Thraka đã sửa chữa.
paul

0

Bạn cũng có thể sử dụng Application.StartupPath một cách tự do từ System.Windows.Forms, nhưng bạn phải thêm tài liệu tham khảo cho hội đồng System.Windows.Forms!

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.