Geçerli klasör yolunu al


222

Dosyaları dönüştüren bir program oluşturmak istiyorum. Kullanıcının herhangi bir dizine yürütülebilir dosyayı yerleştirmek istiyorum ve bu programı yürütürken (.exe çift tıklatarak) Program exe dosyasının bulunduğu geçerli klasördeki tüm dosyaları işlemek istiyorum . Program şu anda yürütmekte olduğu yolu nasıl belirleyebilir?

Denedim System.Windows.Forms.Application.StartupPathama bu yanlış bir yol gibi görünüyor.

Herhangi bir fikir?

Yanıtlar:


335

Sen gerektiğini değil kullanmak Directory.GetCurrentDirectory()geçerli dizin bir kısayol ile programı çalıştırmak, özellikle yürütme klasöründen farklı olabileceğini düşünerek, senin durumunda.

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);Amacınız için kullanmak daha iyidir . Bu, yürütülmekte olan derlemenin bulunduğu yol adını döndürür.

Benim önerdiğim yaklaşım, Soner Gönül'ün cevabında söylediği gibi, yürütme meclisi, giriş meclisi veya herhangi bir yüklü meclis arasında ayrım yapmanıza izin verirken ,

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

ayrıca yeterli olabilir. Bu eşit olur

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly () ve GetExecutingAssembly () ilginç bir farka sahiptir. Ayrıntılar için bkz. Stackoverflow.com/a/18562036/30289
bhadra

3
Söylediğim gibi: Bu, yürütülmekte olan derlemenin bulunduğu yol adını döndürür . Arasındaki fark GetEntryAssemblyve GetExecutingAssemblypek de sürpriz olarak gelmiyor, aynı zamanda fonksiyon adıyla açıktır. Eğer aynısını yaptılarsa, neden iki fonksiyon olmalı? :-)
Thorsten Dittmar

2
+1 Assembly.GetEntryAssembly (), uygulamanın clickonce aracılığıyla çalıştırılması durumunda bana yardımcı oldu
Artiom

9
Bu System.Reflection'da, yani System.Reflection.Assembly.GetExecutingAssembly().Locationtam - Anında Pencereden test ediyorsanız
Kırmızı Bezelye

147
System.AppDomain.CurrentDomain.BaseDirectory

Bu size uygulamanızın çalışan dizinini verecektir. Bu, web uygulamaları için bile çalışır. Daha sonra dosyanıza ulaşabilirsiniz.


9
Bu, bu amaç için kullanılacak en doğru özelliktir. AppDomain, derlemeleri farklı bir konumdan bakmak için dinamik olarak oluşturulmuş olsa bile, CurrentDomain'in BaseDirectory her zaman doğru konumu işaret edecektir.
dhruvin

Mükemmel. Bu, özellikle uygulama türüne bağlı olarak farklı mutlak yolları okuyabilen Streamreader kullanırken herhangi bir uygulama için bağımsız olarak çalışır.
user3326078

40

Aşağıdaki kod ile basit bir konsol uygulaması oluşturdum:

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);

Ortaya çıkan yürütülebilir dosyayı kopyaladım C:\temp2. Sonra o yürütülebilir dosya için bir kısayol yerleştirdi C:\temp3ve koştu (bir kez exe kendisi ve bir kez kısayol). Her iki kez de aşağıdaki çıktıları verdi:

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

Neredeyse tamamen aynı şeyi yapan beş farklı yöntem olduğunu açıklamak için bazı cockamamie nedeni olmalı emin olsa da , kesinlikle ne olduğunu bilmiyorum. Bununla birlikte, çoğu durumda, hangisini sevdiğinizi seçmekte özgürsünüz.

GÜNCELLEME: Kısayol özelliklerini değiştirdim ve "Başlangıç ​​Yeri:" alanını değiştirdim C:\temp3. Bu, aşağıdaki çıktı ile sonuçlanmıştır:

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

... farklı yöntemler arasındaki ayrımların en azından bir kısmını gösteriyor .


2
Çok teşekkür ederim.
baj9032

Önemli bir not. Çalışma dizini her zaman kurulu dizin ile aynı olmayacaktır.
Ürdün



19

Bunu kullan,

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

Bunu da kullanabilirsiniz.

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

9

için .NET CORE kullanımSystem.AppContext.BaseDirectory

(yerine AppDomain.CurrentDomain.BaseDirectory)


6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory

Environment.CurrentDirectoryçeşitli şekillerde değiştirilebilir ... (kısayol ayarları, vb.)
Yousha Aleayoub


0

Eğer exe yolunu kullanabilirsiniz System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

Özellikle dotnet core tek dosya yayınlama kullanırken bu benim için en iyi şekilde çalışır. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.