Saya melihat bahwa ada beberapa cara untuk mendapatkan jalur folder aplikasi:
Application.StartupPath
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
AppDomain.CurrentDomain.BaseDirectory
System.IO.Directory.GetCurrentDirectory()
Environment.CurrentDirectory
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
System.IO.Path.GetDirectory(Application.ExecutablePath)
Apa cara terbaik tergantung pada situasinya?
IHostEnvironment.ContentRootPath
, diakses melaluiIHostEnvironment
ketergantungan yang disuntikkan (yang berisi hal-hal berguna lainnya).Jawaban:
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.
CodeBase
adalah tempat di mana file ditemukan dan bisa menjadi URL yang dimulai dengan http: //. Dalam halLocation
ini mungkin akan menjadi cache unduhan perakitan. CodeBase tidak dijamin akan ditetapkan untuk majelis di GAC .sumber
Path.Combine
. Ini akan menangani backslash tambahan untuk Anda.Application.StartupPath
dan 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Hanya akan berfungsi untuk aplikasi Windows FormsSystem.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.AppDomain.CurrentDomain.BaseDirectory
untuk aplikasi web bisa bermanfaat dan akan mengembalikan sesuatu seperti"C:\\hg\\Services\\Services\\Services.Website\\"
yang merupakan direktori dasar dan cukup berguna.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"
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
akan memberi Anda lokasi di mana
.dll
kode 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.
sumber
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:
mengembalikan
StartupPath
parameter (dapat diatur saat menjalankan aplikasi)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).sumber
GetCurrentDirectory()
, karena cinta menjalankan sesuatu dari jalan yang berbeda! :(Untuk aplikasi web, untuk mendapatkan direktori root aplikasi web saat ini, biasanya panggil halaman web untuk permintaan masuk saat ini:
Deskripsi kode di atas
sumber
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:
Mungkin bermanfaat bagi sebagian dari Anda, melakukan hal yang sama, ketika Anda mencari variabel terbaik untuk kasus Anda.
sumber
Dalam pengalaman saya, cara terbaik adalah kombinasi dari semua ini.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Akan memberi Anda folder tempat sampahDirectory.GetCurrentDirectory()
Berfungsi baik di .Net Core tetapi tidak .Net dan akan memberi Anda direktori root proyekSystem.AppContext.BaseDirectory
danAppDomain.CurrentDomain.BaseDirectory
berfungsi dengan baik di .Net tetapi tidak .Net inti dan akan memberi Anda direktori root proyekDi perpustakaan kelas yang seharusnya menargetkan.Net dan .Net inti saya memeriksa kerangka mana yang menampung perpustakaan dan memilih satu atau yang lain.
sumber
Saya telah menggunakan ini dengan sukses
Ia bekerja bahkan di dalam linqpad.
sumber
Direktori root:
sumber
Jika Anda tahu untuk mendapatkan direktori root:
sumber
yang ini
System.IO.Path.GetDirectory(Application.ExecutablePath)
berubah menjadiSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)
sumber