Dapatkan jalur folder saat ini

222

Saya ingin membuat program yang mengubah file. Saya ingin pengguna dapat menempatkan file yang dapat dieksekusi di direktori mana pun, dan ketika menjalankan program itu (mengklik dua kali pada .exe) Saya ingin program memproses semua file dalam folder saat ini di mana file exe ada . Bagaimana program dapat menentukan jalur yang saat ini dijalankannya?

Saya mencoba System.Windows.Forms.Application.StartupPathtetapi tampaknya itu cara yang salah.

Ada ide?

pengguna2214609
sumber

Jawaban:

334

Anda tidak boleh menggunakan Directory.GetCurrentDirectory()dalam kasus Anda, karena direktori saat ini mungkin berbeda dari folder eksekusi, terutama ketika Anda menjalankan program melalui jalan pintas.

Lebih baik digunakan Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);untuk tujuan Anda. Ini mengembalikan nama path tempat majelis yang sedang menjalankan berada.

Sementara pendekatan yang saya sarankan memungkinkan Anda untuk membedakan antara rakitan pelaksana, rakitan entri atau rakitan lainnya yang dimuat, seperti yang dikatakan Soner Gönül dalam jawabannya,

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

mungkin juga cukup. Ini akan sama dengan

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Thorsten Dittmar
sumber
10
GetEntryAssembly () dan GetExecutingAssembly () memiliki perbedaan yang menarik. Untuk detail, lihat stackoverflow.com/a/18562036/30289
bhadra
3
Seperti yang saya katakan: Ini mengembalikan nama path tempat majelis yang sedang menjalankan berada. Perbedaan antara GetEntryAssemblydan GetExecutingAssemblytidak terlalu mengejutkan, juga jelas dengan nama fungsinya. Jika mereka melakukan hal yang sama, mengapa harus ada dua fungsi? :-)
Thorsten Dittmar
2
+1 Assembly.GetEntryAssembly () membantu saya jika menjalankan aplikasi melalui clickonce
Artiom
9
Ini ada di System.Reflection, jadi System.Reflection.Assembly.GetExecutingAssembly().Locationlengkap - jika Anda menguji dari Window Segera
The Red Pea
147
System.AppDomain.CurrentDomain.BaseDirectory

Ini akan memberi Anda menjalankan direktori aplikasi Anda. Ini bahkan berfungsi untuk aplikasi web. Setelah itu Anda dapat membuka file Anda.

hakan
sumber
9
Ini adalah properti paling akurat untuk digunakan untuk tujuan ini. BaseDirectory CurrentDomain akan selalu menunjuk ke lokasi yang benar bahkan jika AppDomain secara dinamis dibuat untuk melihat rakitan dari lokasi yang berbeda.
dhruvin
Sempurna. Ini bekerja secara independen untuk aplikasi apa pun, terutama ketika menggunakan Streamreader, yang dapat membaca jalur absolut berbeda tergantung pada jenis aplikasi.
user3326078
40

Saya membuat aplikasi konsol sederhana dengan kode berikut:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

Saya menyalin hasil yang dapat dieksekusi ke C:\temp2. Saya kemudian menempatkan jalan pintas ke executable itu C:\temp3, dan menjalankannya (sekali dari exe itu sendiri, dan sekali dari jalan pintas). Ini memberi output berikut dua kali:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

Sementara saya yakin pasti ada beberapa alasan cockamamie untuk menjelaskan mengapa ada lima metode yang berbeda yang melakukan hampir hal yang persis sama, saya pasti tidak tahu apa itu. Namun demikian, kelihatannya dalam sebagian besar keadaan, Anda bebas memilih mana yang Anda sukai.

UPDATE: Saya memodifikasi properti Shortcut, mengubah bidang "Mulai Di:" menjadi C:\temp3. Ini menghasilkan output sebagai berikut:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... yang menunjukkan setidaknya beberapa perbedaan antara metode yang berbeda.

kmote
sumber
2
Terima kasih banyak.
baj9032
Catatan penting. Direktori kerja tidak selalu sama dengan direktori yang diinstal.
Jordan
24

Coba ini:

System.Environment.CurrentDirectory

Hossein Narimani Rad
sumber
1
Environment.CurrentDirectorydapat diubah dalam beberapa cara ... (pengaturan shotrtcut, dll)
Yousha Aleayoub
21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

Dari Path.GetDirectoryName

Mengembalikan informasi direktori untuk string path yang ditentukan.

Dari Application.ExecutablePath

Mendapat jalur untuk file yang dapat dieksekusi yang memulai aplikasi, termasuk nama yang dapat dieksekusi.

Soner Gönül
sumber
19

Gunakan ini,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

Anda dapat menggunakan ini juga.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
fhnaseer
sumber
9

untuk penggunaan .NET CORESystem.AppContext.BaseDirectory

(sebagai pengganti untuk AppDomain.CurrentDomain.BaseDirectory)

yonatan
sumber
6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory
Tomtom
sumber
Environment.CurrentDirectorydapat diubah dalam beberapa cara ... (pengaturan shotrtcut, dll)
Yousha Aleayoub
0

Jika Anda menginginkan jalur exe yang dapat Anda gunakan System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

Howard Rothenburg
sumber
0

Ini bekerja paling baik untuk saya, terutama ketika menggunakan mempublikasikan file single dotnet core. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

Keisha W
sumber