Cara terbaik untuk mendapatkan jalur folder aplikasi

515

Saya melihat bahwa ada beberapa cara untuk mendapatkan jalur folder aplikasi:

  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)

Apa cara terbaik tergantung pada situasinya?

Leo Vo
sumber
9
Mengapa kami memiliki banyak cara untuk mendapatkan jalur aplikasi. Saya pikir ada alasan untuk setiap cara.
Leo Vo
1
Ada kesalahan di # 6: harus membaca: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
BillW
2
hore untuk # 6, ketika saya sedang dalam proyek web, saya tidak ingin logika Server.MapPath di pustaka yang dimuat
IoC
1
Kami sekarang memiliki yang andal IHostEnvironment.ContentRootPath, diakses melalui IHostEnvironmentketergantungan yang disuntikkan (yang berisi hal-hal berguna lainnya).
Timo

Jawaban:

519

AppDomain.CurrentDomain.BaseDirectory mungkin yang paling berguna untuk mengakses file yang lokasinya relatif terhadap direktori instal aplikasi.

Dalam aplikasi ASP.NET, ini akan menjadi direktori root aplikasi, bukan subfolder bin - yang mungkin memang Anda inginkan. Dalam aplikasi klien, itu akan menjadi direktori yang berisi executable utama.

Dalam aplikasi VSTO 2005, itu akan menjadi direktori yang berisi rakitan terkelola VSTO untuk aplikasi Anda, bukan, katakanlah, jalur ke executable Excel.

Yang lain dapat mengembalikan direktori yang berbeda tergantung pada lingkungan Anda - misalnya lihat jawaban @ Vimvq1987.

CodeBaseadalah tempat di mana file ditemukan dan bisa menjadi URL yang dimulai dengan http: //. Dalam hal Locationini mungkin akan menjadi cache unduhan perakitan. CodeBase tidak dijamin akan ditetapkan untuk majelis di GAC .

Joe
sumber
2
Saat menguji pada Windows XP 32bit, ia mengembalikan tempat pintasan dimulai.
Joshua Son
1
+1 @ Jo dan Untuk add-in tingkat dokumen VSTO lihat INI
3
Sadarilah bahwa ini mengembalikan jalur dengan garis miring terbalik di akhir. Ini menyebabkan saya bermasalah ketika memformat string dengan hasil untuk diteruskan sebagai argumen proses.
lanjut
19
@avenmore - Jika Anda memformat string untuk membangun jalur, pertimbangkan untuk menggunakannya Path.Combine. Ini akan menangani backslash tambahan untuk Anda.
Joe
1
Ini mengembalikan folder bin / debug untuk saya di VS 2017, bukan direktori root.
SmoveBB
86
  1. Application.StartupPathdan 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- Hanya akan berfungsi untuk aplikasi Windows Forms

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

    Akan memberi Anda sesuatu seperti: di "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"mana halaman yang Anda jalankan berada.

  3. AppDomain.CurrentDomain.BaseDirectoryuntuk aplikasi web bisa bermanfaat dan akan mengembalikan sesuatu seperti "C:\\hg\\Services\\Services\\Services.Website\\"yang merupakan direktori dasar dan cukup berguna.

  4. System.IO.Directory.GetCurrentDirectory() dan 5. Environment.CurrentDirectory

akan memberi Anda lokasi dari mana proses dipecat dari - jadi untuk aplikasi web berjalan dalam mode debug dari Visual Studio seperti "C:\\Program Files (x86)\\IIS Express"

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

akan memberi Anda lokasi di mana .dllkode itu dijalankan, untuk aplikasi web yang bisa"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

Sekarang dalam kasus misalnya titik aplikasi konsol 2-6 akan menjadi direktori tempat .exe file.

Semoga ini menghemat waktu Anda.

Matas Vaitkevicius
sumber
2
Cukup yakin menginginkan "folder saat ini" hanya relevan untuk aplikasi non-web ...
Nyerguds
2
Ini jawabannya.
P.Brian.Mackey
59

Perhatikan bahwa tidak semua metode ini akan mengembalikan nilai yang sama. Dalam beberapa kasus, mereka dapat mengembalikan nilai yang sama, tetapi hati-hati, tujuannya berbeda:

Application.StartupPath

mengembalikan StartupPathparameter (dapat diatur saat menjalankan aplikasi)

System.IO.Directory.GetCurrentDirectory()

mengembalikan direktori saat ini, yang mungkin atau mungkin bukan folder tempat aplikasi berada. Hal yang sama berlaku untuk Environment.CurrentDirectory. Jika Anda menggunakan ini dalam file DLL, itu akan mengembalikan jalur di mana proses sedang berjalan (ini terutama berlaku di ASP.NET).

Quan Mai
sumber
7
Tolong, tolong jangan gunakan GetCurrentDirectory(), karena cinta menjalankan sesuatu dari jalan yang berbeda! :(
kayleeFrye_onDeck
@kayleeFrye_onDeck Anda tidak memasukkan alasan Anda untuk pertanyaan sebelumnya.
nless
10

Untuk aplikasi web, untuk mendapatkan direktori root aplikasi web saat ini, biasanya panggil halaman web untuk permintaan masuk saat ini:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Deskripsi kode di atas

Raj kumar
sumber
6

Saya memulai proses dari Layanan Windows melalui API Win32 di sesi dari pengguna yang benar-benar masuk (di sesi Task Manager 1 bukan 0). Dalam hal ini kita bisa mengenal, variabel mana yang terbaik.

Untuk semua 7 kasus dari pertanyaan di atas, berikut adalah hasilnya:

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

Mungkin bermanfaat bagi sebagian dari Anda, melakukan hal yang sama, ketika Anda mencari variabel terbaik untuk kasus Anda.

Beetee
sumber
4
Jawaban yang sangat relevan. Begitu banyak orang lupa bahwa "direktori kerja"! = "Direktori program".
Nyerguds
3

Dalam pengalaman saya, cara terbaik adalah kombinasi dari semua ini.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase Akan memberi Anda folder tempat sampah
  2. Directory.GetCurrentDirectory() Berfungsi baik di .Net Core tetapi tidak .Net dan akan memberi Anda direktori root proyek
  3. System.AppContext.BaseDirectorydan AppDomain.CurrentDomain.BaseDirectory berfungsi dengan baik di .Net tetapi tidak .Net inti dan akan memberi Anda direktori root proyek

Di perpustakaan kelas yang seharusnya menargetkan.Net dan .Net inti saya memeriksa kerangka mana yang menampung perpustakaan dan memilih satu atau yang lain.

Ahmed Mansour
sumber
2

Saya telah menggunakan ini dengan sukses

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

Ia bekerja bahkan di dalam linqpad.

camilohe
sumber
1
ini tidak memiliki braket pembuka dari GetCurrentProcess. btw dievaluasi menjadi C: \ Program Files \ dotnet dalam proyek inti .net saya saat debugging di visual studio karena di situlah dotnet.exe berada
t0b4cc0
1

Direktori root:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
Alparslan ŞEN
sumber
1
Ini tampaknya untuk mendapatkan direktori kerja saat ini, sementara itu kadang-kadang berguna, itu pasti tidak dijamin menjadi jalur EXE.
krowe2
0

Jika Anda tahu untuk mendapatkan direktori root:

string rootPath = Path.GetPathRoot(Application.StartupPath)
Alparslan ŞEN
sumber
0

yang ini System.IO.Path.GetDirectory(Application.ExecutablePath)berubah menjadiSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)

nazim hatipoglu
sumber