Bagaimana cara menemukan jalur aplikasi di aplikasi konsol?
Di Windows Forms , saya dapat menggunakan Application.StartupPath
untuk menemukan jalur saat ini, tetapi ini sepertinya tidak tersedia di aplikasi konsol.
c#
.net
console
console-application
JSmyth
sumber
sumber
Jawaban:
System.Reflection.Assembly.GetExecutingAssembly()
. 1Location
Kombinasikan dengan
System.IO.Path.GetDirectoryName
jika yang Anda inginkan adalah direktori.sumber
GetExecutingAssembly
mengembalikan perakitan yang berisi kode yang saat ini dieksekusi . Ini mungkin belum tentu merupakan konsol .exe . Mungkin perakitan yang telah dimuat dari lokasi yang sama sekali berbeda. Anda harus menggunakanGetEntryAssembly
! Perhatikan juga bahwaCodeBase
mungkin tidak diatur ketika perakitan di GAC. Alternatif yang lebih baik adalahAppDomain.CurrentDomain.BaseDirectory
.Anda dapat menggunakan kode berikut untuk mendapatkan direktori aplikasi saat ini.
sumber
BaseDirectory
dapat diatur saat runtime? Ini hanya memiliki rajin dan giat.Anda memiliki dua opsi untuk menemukan direktori aplikasi, yang Anda pilih tergantung pada tujuan Anda.
sumber
var localDirectory = new Uri(directory).LocalPath;
Mungkin agak terlambat tapi ini layak disebutkan:
Atau lebih tepatnya untuk mendapatkan hanya jalur direktori:
Edit:
Beberapa orang telah menunjukkan bahwa
GetCommandLineArgs
tidak dijamin untuk mengembalikan nama program. Lihat Kata pertama pada baris perintah adalah nama program hanya dengan konvensi . Artikel itu menyatakan bahwa "Meskipun sangat sedikit program Windows menggunakan kekhasan ini (saya sendiri tidak mengetahui adanya)". Jadi dimungkinkan untuk 'spoof'GetCommandLineArgs
, tetapi kita berbicara tentang aplikasi konsol. Aplikasi konsol biasanya cepat dan kotor. Jadi ini cocok dengan filosofi KISS saya.sumber
Bagi siapa pun yang tertarik dengan aplikasi web asp.net. Berikut adalah hasil saya dari 3 metode berbeda
hasil
aplikasi ini berjalan secara fisik dari "C: \ inetpub \ SBSPortal_staging", jadi solusi pertama jelas tidak sesuai untuk aplikasi web.
sumber
Jawaban di atas adalah 90% dari yang saya butuhkan, tetapi mengembalikan Uri alih-alih jalur reguler untuk saya.
Seperti yang dijelaskan dalam posting forum MSDN, Bagaimana cara mengubah jalur URI ke file normal? , Saya menggunakan yang berikut ini:
sumber
File.CreateDirectory(path)
, itu akan memberi Anda pengecualian bahwa itu tidak memungkinkan jalur URI ...#
karakter). Identifier dan semua yang mengikutinya terpotong dari jalur yang dihasilkan.new Uri
danSystem.IO.Path.GetDirectoryName
? Itu memberi Anda string jalur normal, bukan aUri
.Anda mungkin ingin melakukan ini:
sumber
Anda dapat menggunakan yang ini sebagai gantinya.
sumber
Jika Anda mencari cara .NET Core yang kompatibel, gunakan
Ini diperkenalkan di .NET Framework 4.6 dan .NET Core 1.0 (dan .NET Standard 1.3). Lihat: AppContext.BaseDirectory Property .
Menurut halaman ini ,
sumber
Process.GetCurrentProcess().MainModule.FileName
Untuk Aplikasi Konsol, Anda dapat mencoba ini:
Output (pada mesin lokal saya):
Atau Anda dapat mencoba (ada backslash tambahan pada akhirnya):
Keluaran:
sumber
BaseDirectory
Dapat diatur saat runtime. TIDAK dijamin benar"Saya telah menggunakan kode ini dan mendapatkan solusinya.
sumber
Anda cukup menambahkan referensi proyek Anda
System.Windows.Forms
dan kemudian menggunakanSystem.Windows.Forms.Application.StartupPath
seperti biasa.Jadi, tidak perlu metode yang lebih rumit atau menggunakan refleksi.
sumber
Baris berikut akan memberi Anda jalur aplikasi:
Solusi di atas berfungsi dengan baik dalam situasi berikut:
mkbundle
bundel Mono (tidak ada metode lain yang berfungsi)sumber
Saya menggunakan ini jika exe seharusnya dipanggil dengan mengklik dua kali
sumber
Saya sudah menggunakan
ketika saya ingin mencari jalur relatif ke folder aplikasi. Ini berfungsi baik untuk aplikasi ASP.Net maupun winform. Itu juga tidak memerlukan referensi ke System.Web rakitan.
sumber
Maksud saya, mengapa tidak ap / memanggil metode?
Anda akan menggunakannya seperti Application.StartupPath:
sumber
Assembly.GetEntryAssembly().Location
atauAssembly.GetExecutingAssembly().Location
Gunakan bersama dengan
System.IO.Path.GetDirectoryName()
untuk mendapatkan hanya direktori.Path dari
GetEntryAssembly()
danGetExecutingAssembly()
dapat berbeda, meskipun untuk sebagian besar kasus direktori akan sama.Dengan
GetEntryAssembly()
Anda harus menyadari bahwa ini dapat kembalinull
jika modul entri tidak dikelola (yaitu C ++ atau VB6 dapat dieksekusi). Dalam kasus tersebut, dimungkinkan untuk menggunakanGetModuleFileName
dari Win32 API:sumber
di VB.net
berfungsi untuk saya (Tipe Aplikasi: Perpustakaan Kelas). Tidak yakin tentang C # ... Mengembalikan jalur tanpa Nama file sebagai string
sumber
Akan menyelesaikan masalah untuk merujuk file referensi pihak ke-3 dengan paket instalasi.
sumber
Tidak satu pun dari metode ini bekerja dalam kasus khusus seperti menggunakan tautan simbolis ke exe, mereka akan mengembalikan lokasi tautan bukan exe yang sebenarnya.
Jadi dapat menggunakan QueryFullProcessImageName untuk menyiasati itu:
sumber
Coba baris kode sederhana ini:
sumber
Solusi lain adalah menggunakan jalur relatif yang menunjuk ke jalur saat ini:
sumber
Saya tidak melihat siapa pun mengonversi LocalPath yang disediakan oleh .Net Core refleksi ke jalur System.IO yang dapat digunakan jadi inilah versi saya.
Ini akan mengembalikan path lengkap yang diformat "C: \ xxx \ xxx" ke tempat kode Anda.
sumber
Ada banyak cara untuk mendapatkan jalur yang dapat dieksekusi, yang mana yang harus kita gunakan tergantung pada kebutuhan kita di sini adalah tautan yang membahas berbagai metode.
Berbagai cara untuk mendapatkan Jalur Eksekusi Aplikasi
sumber
Berikut ini adalah solusi andal yang bekerja dengan 32bit dan 64bit aplikasi .
Tambahkan referensi ini:
Tambahkan metode ini ke proyek Anda:
Sekarang gunakan seperti ini:
Perhatikan bahwa jika Anda mengetahui id proses, maka metode ini akan mengembalikan ExecutePath yang sesuai.
Ekstra, bagi yang berminat:
... akan memberi Anda array dari semua proses yang sedang berjalan, dan ...
... akan memberi Anda proses saat ini, bersama dengan informasi mereka misalnya Id, dll. dan juga kendali terbatas mis. Kill, dll. *
sumber
Anda dapat membuat nama folder sebagai Sumber Daya dalam proyek menggunakan Solution Explorer, lalu Anda dapat menempelkan file di dalam Sumber Daya.
sumber