Cara terbaik untuk mendapatkan aplikasi path folder

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

  1. Aplikasi.StartupPath
  2. Sistem.IO.Jalan.GetDirectoryName( Sistem.Refleksi.Perakitan.GetExecutingAssembly().Lokasi)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. Sistem.IO.Directory.GetCurrentDirectory()
  5. Lingkungan.CurrentDirectory
  6. Sistem.IO.Jalan.GetDirectoryName( Sistem.Refleksi.Perakitan.GetExecutingAssembly().GetName().CodeBase)
  7. Sistem.IO.Jalan.GetDirectory(Aplikasi.ExecutablePath)

Apa cara terbaik tergantung pada situasi?

Mengomentari pertanyaan (4)
Larutan

AppDomain.CurrentDomain.BaseDirectory adalah mungkin yang paling berguna untuk mengakses file dan lokasi relatif terhadap aplikasi direktori instalasi.

Dalam ASP.NET aplikasi ini akan menjadi aplikasi root direktori, bukan bin subfolder yang mungkin adalah apa yang biasanya anda inginkan. Dalam aplikasi klien, itu akan menjadi direktori yang berisi executable utama.

Dalam VSTO 2005 aplikasi, itu akan menjadi direktori yang berisi VSTO berhasil rakitan untuk aplikasi anda, tidak, mengatakan, jalan menuju eksekusi Excel.

Yang lain mungkin kembali direktori yang berbeda tergantung pada lingkungan anda - misalnya melihat @Vimvq1987's jawaban.

Kode adalah tempat di mana file yang ditemukan dan dapat menjadi URL yang dimulai dengan http://. Dalam hal ini Lokasi mungkin akan menjadi majelis download cache. Kode ini tidak dijamin akan ditetapkan untuk sidang di GAC.

Komentar (10)
  1. Aplikasi.StartupPath ' dan 7.Sistem.IO.Jalan.GetDirectoryName(Aplikasi.ExecutablePath)` - Ini hanya akan bekerja untuk [aplikasi Windows Forms][1]

  2. Sistem.IO.Jalan.GetDirectoryName( Sistem.Refleksi.Perakitan.GetExecutingAssembly().Lokasi)

Ini akan memberikan anda sesuatu seperti: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET File\\hukum-layanan\\e84f415e\\96c98009\\mpr\\dl3\\42aaba80\\bcf9fd83_4b63d101" yang mana halaman yang sedang anda jalankan ini.

  1. AppDomain.CurrentDomain.BaseDirectory untuk aplikasi web ini bisa berguna dan akan kembali sesuatu seperti "C:\\hg\\Services\\Services\\Services.Website\\" yang merupakan basis direktori dan cukup berguna.

  2. Sistem.IO.Directory.GetCurrentDirectory() dan 5. Lingkungan.CurrentDirectory

anda akan mendapatkan lokasi dimana proses yang dipecat dari - jadi untuk aplikasi web yang berjalan dalam mode debug dari Visual Studio sesuatu seperti "C:\\Program Files (x86)\\IIS Express"

  1. Sistem.IO.Jalan.GetDirectoryName( Sistem.Refleksi.Perakitan.GetExecutingAssembly().GetName().CodeBase)

anda akan mendapatkan lokasi di mana .dll yang menjalankan kode ini, untuk aplikasi web yang bisa menjadi "berkas:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

Sekarang dalam kasus misalnya aplikasi konsol poin 2-6 akan menjadi direktori di mana .exe file.

Harapan ini menghemat anda beberapa waktu.

[1]: https://msdn.microsoft.com/en-us/library/system.windows.forms.application.startuppath(v=vs. 110).aspx

Komentar (2)

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

Application.StartupPath

mengembalikan StartupPath (parameter dapat diatur ketika menjalankan aplikasi)

System.IO.Directory.GetCurrentDirectory()

kembali direktori saat ini, yang mungkin atau mungkin tidak menjadi folder dimana aplikasi tersebut berada. Hal yang sama berlaku untuk Lingkungan.CurrentDirectory. Dalam kasus anda menggunakan ini dalam sebuah file DLL, itu akan kembali jalur dimana proses yang sedang berjalan (hal ini terutama berlaku di ASP.NET).

Komentar (3)

Untuk aplikasi web, untuk saat ini aplikasi web direktori root, umumnya menyebut dengan halaman web untuk saat ini permintaan yang masuk:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Kode di atas deskripsi

Komentar (0)

Dalam pengalaman saya, cara terbaik adalah kombinasi dari ini.

  1. Sistem.Refleksi.Perakitan.GetExecutingAssembly().GetName().CodeBase Akan memberikan anda folder bin
  2. Direktori.GetCurrentDirectory() Bekerja dengan baik pada .Net Core tapi tidak .Net dan akan memberikan direktori root dari proyek
  3. Sistem.AppContext.BaseDirectory dan AppDomain.CurrentDomain.BaseDirectory Bekerja dengan baik dalam .Bersih tapi tidak .Net core dan akan memberikan direktori root dari proyek

Di perpustakaan kelas yang seharusnya target.Net dan .Net inti saya memeriksa kerangka hosting perpustakaan dan memilih satu atau yang lain.

Komentar (0)

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

Untuk semua 7 kasus dari pertanyaan di atas, berikut ini 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 itu's membantu bagi beberapa dari anda, melakukan hal yang sama, ketika anda mencari variabel terbaik untuk kasus anda.

Komentar (1)

Saya telah menggunakan ini berhasil

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

Ia bekerja bahkan dalam linqpad.

Komentar (2)

Direktori Root:

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

ini salah satu "System.IO.Jalan.GetDirectory(Aplikasi.ExecutablePath)" berubah ke Sistem.IO.Jalan.GetDirectoryName(Aplikasi.ExecutablePath)

Komentar (0)

Jika anda tahu untuk mendapatkan direktori root:

string rootPath = Path.GetPathRoot(Application.StartupPath)
Komentar (0)