Cách tốt nhất để có được đường dẫn thư mục ứng dụng


515

Tôi thấy rằng có một số cách để có được đường dẫn thư mục ứng dụng:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

Cách tốt nhất tùy thuộc vào tình huống là gì?


9
Tại sao chúng ta có nhiều cách để có được đường dẫn của ứng dụng. Tôi nghĩ rằng có một lý do cho mỗi cách.
Leo Võ

1
Có lỗi ở # 6: nên đọc: System.Reflection.Assugging.GetExecutingAssugging (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
BillW

2
Hoan hô cho # 6, trong khi tôi đang ở trong một dự án web, tôi không muốn Server.MapPath logic trong IoC tôi nạp thư viện mà không phải là trang web cụ thể trong tự nhiên
bkwdesign

Bây giờ chúng ta có độ tin cậy IHostEnvironment.ContentRootPath, được truy cập thông qua một IHostEnvironmentphụ thuộc được tiêm (có chứa những thứ hữu ích khác).
Timo

Câu trả lời:


519

AppDomain.CurrentDomain.BaseDirectory có lẽ là hữu ích nhất để truy cập các tệp có vị trí liên quan đến thư mục cài đặt ứng dụng.

Trong một ứng dụng ASP.NET, đây sẽ là thư mục gốc của ứng dụng, không phải thư mục con bin - có lẽ là những gì bạn thường muốn. Trong một ứng dụng khách, nó sẽ là thư mục chứa tệp thực thi chính.

Trong một ứng dụng VSTO 2005, nó sẽ là thư mục chứa các hội đồng được quản lý VSTO cho ứng dụng của bạn, chứ không phải là đường dẫn đến tệp thực thi Excel.

Những người khác có thể trả về các thư mục khác nhau tùy thuộc vào môi trường của bạn - ví dụ: xem câu trả lời của @ Vimvq1987.

CodeBaselà nơi tìm thấy tệp và có thể là URL bắt đầu bằng http: //. Trong trường hợp Locationđó có thể sẽ là bộ đệm tải về lắp ráp. CodeBase không được đảm bảo được đặt cho các hội đồng trong GAC .


2
Khi kiểm tra trong Windows XP 32bit, nó sẽ trả về nơi lối tắt bắt đầu.
Joshua Son

1
+1 @Joe và Đối với bổ trợ cấp độ tài liệu VSTO, hãy xem NÀY

3
Xin lưu ý rằng điều này trả về một đường dẫn có dấu gạch chéo ngược ở cuối. Điều này gây ra cho tôi các vấn đề khi định dạng một chuỗi với kết quả để chuyển qua làm đối số quy trình.
avenmore

19
@avenmore - Nếu bạn định dạng một chuỗi để xây dựng một đường dẫn, hãy xem xét sử dụng Path.Combinethay thế. Điều này sẽ chăm sóc dấu gạch chéo ngược cho bạn.
Joe

1
Điều này sẽ trả lại thư mục bin / debug cho tôi trong VS 2017, không phải thư mục gốc.
SmoveBB

86
  1. Application.StartupPathvà 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- Chỉ hoạt động cho ứng dụng Windows Forms

  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)

    Sẽ cung cấp cho bạn một cái gì đó như: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"đó là nơi trang bạn đang chạy.

  3. AppDomain.CurrentDomain.BaseDirectorycho ứng dụng web có thể hữu ích và sẽ trả về một cái gì đó giống như "C:\\hg\\Services\\Services\\Services.Website\\"thư mục cơ sở và khá hữu ích.

  4. System.IO.Directory.GetCurrentDirectory() và 5. Environment.CurrentDirectory

sẽ giúp bạn biết vị trí nơi quy trình được kích hoạt - vì vậy, ứng dụng web đang chạy ở chế độ gỡ lỗi từ Visual Studio giống như "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

sẽ giúp bạn biết vị trí .dllđang chạy mã, đối với ứng dụng web có thể là"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

Bây giờ trong trường hợp ví dụ ứng dụng giao diện điều khiển, điểm 2-6 sẽ là thư .exe mục chứa tệp.

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.


2
Chắc chắn rằng muốn "thư mục hiện tại" chỉ phù hợp với các ứng dụng không phải web ...
Nyerguds

2
Đây là câu trả lời.
P.Brian.Mackey

59

Lưu ý rằng không phải tất cả các phương thức này sẽ trả về cùng một giá trị. Trong một số trường hợp, chúng có thể trả về cùng một giá trị, nhưng hãy cẩn thận, mục đích của chúng là khác nhau:

Application.StartupPath

trả về StartupPaththam số (có thể được đặt khi chạy ứng dụng)

System.IO.Directory.GetCurrentDirectory()

trả về thư mục hiện tại, có thể hoặc không phải là thư mục chứa ứng dụng. Cũng vậy Environment.CurrentDirectory. Trong trường hợp bạn đang sử dụng điều này trong một tệp DLL, nó sẽ trả về đường dẫn của quá trình đang chạy (điều này đặc biệt đúng trong ASP.NET).


7
Xin vui lòng đừng sử dụng GetCurrentDirectory(), vì tình yêu chạy mọi thứ từ những con đường khác nhau! :(
kayleeFrye_onDeck

@kayleeFrye_onDeck bạn đã không đưa ra lý do cho câu hỏi trước đó.
nless

10

Đối với một ứng dụng web, để có được thư mục gốc của ứng dụng web hiện tại, thường gọi theo trang web cho yêu cầu đến hiện tại:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Mô tả mã trên


6

Tôi đã bắt đầu một quy trình từ Dịch vụ Windows qua API Win32 trong phiên từ người dùng thực sự đã đăng nhập (trong phiên Trình quản lý tác vụ 1 không phải 0). Trong đó là chúng ta có thể biết, biến nào là tốt nhất.

Đối với tất cả 7 trường hợp từ câu hỏi trên, sau đây là kết quả:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

Có lẽ nó hữu ích cho một số bạn, làm những việc tương tự, khi bạn tìm kiếm biến tốt nhất cho trường hợp của bạn.


4
Câu trả lời rất phù hợp. Vì vậy, nhiều người quên rằng "thư mục làm việc"! = "Thư mục chương trình".
Nyerguds

3

Theo kinh nghiệm của tôi, cách tốt nhất là kết hợp những thứ này.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase Sẽ cung cấp cho bạn thư mục bin
  2. Directory.GetCurrentDirectory() Hoạt động tốt trên .Net Core nhưng không .Net và sẽ cung cấp cho bạn thư mục gốc của dự án
  3. System.AppContext.BaseDirectoryAppDomain.CurrentDomain.BaseDirectory Hoạt động tốt trong .Net nhưng không phải .Net core và sẽ cung cấp cho bạn thư mục gốc của dự án

Trong một thư viện lớp được cho là target.Net và .Net core, tôi kiểm tra khung nào đang lưu trữ thư viện và chọn cái này hay cái kia.


2

Tôi đã sử dụng cái này thành công

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

Nó hoạt động ngay cả bên trong linqpad.


1
điều này thiếu khung mở của GetCienProcess. btw nó ước tính thành C: \ Program Files \ dotnet trong dự án lõi .net của tôi trong khi gỡ lỗi trong phòng thu trực quan vì đó là nơi dotnet.exe được đặt
t0b4cc0

1

Thư mục gốc:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
Điều này dường như để có được thư mục làm việc hiện tại, trong khi đôi khi có thể hữu ích, nó chắc chắn không được đảm bảo là đường dẫn EXE.
krowe2

0

Nếu bạn biết để có được thư mục gốc:

string rootPath = Path.GetPathRoot(Application.StartupPath)

0

cái này System.IO.Path.GetDirectory(Application.ExecutablePath)đổi thànhSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)

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.