Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 31124|Yanıt: 2

[Konsol Programı] Mevcut dizini almak için System.Environment.CurrentDirectory ile dikkatli olun

[Bağlantıyı kopyala]
Yayınlandı 10.11.2020 15:04:17 | | | |
Son çalışmalarımda, müşteri hatırlatıcıları için küçük bir araç yapmak istiyorum; Doğal olarak, winform programı uygulamanın (exe.config dosyasını değil) aynı dizinin yapılandırma dosyasını okumalıdır;

Mevcut uygulamanın bulunduğu dizini okumak için hemen System.Environment.CurrentDirectory sayfasını kullanarak mevcut çalışma dizini aldım. Program kusursuz çalışıyor gibi görünüyor;

Ertesi sabah işe geldiğimde "Yapılandırma dosyası kayıp oku" çıktı. Uygulama önyükleme otomatik başlatma ekliyor. Bu mesaj açılır ve yapılandırma dosyası hatasını okuyur, uygulama dizinindeki yapılandırma dosyasının kendi başına silinip silinmediğini hemen kontrol eder. Kontrol ettikten sonra dosyanın hâlâ orada olduğunu gördüm, programdan çıktım ve tekrar çalıştırdım

Hâlâ sorun yok, açılır pencere okuma profili eksik. Sonra kayıt defterindeki önyükleme girişinin yolunun dizinimde olup olmadığını görmek ister misin? Yol dosyasına bakınca, sorun yok. Biraz kafanız mı karıştı? Bilgisayardan çıkış yapıp yeniden başlatmaya çalıştığımda yine de konfigürasyon dosyası eksik çıkıyor. Yolu bulamamanın nedeni doğrudan alınacak

MessageBox'ta program çalışır ve yolun gerçekten bu yol olduğunu bulur.

MessageBox kodunu ekleyin ve testi başlatmaya devam edin. Açtığımda, şu anda çıkan dizinin C:\Windows\System32 olduğunu gördüm ve hemen şaşırdım. Kendi kendime düşündüm, belki Lao Tzu'nun programı system32'ye kadar çalışıyor olabilir mi? Kayıt defterini kontrol ediyorum ve sysetm32'de uygulamam yok. Son olarak, yolu bulmak için kodda bir sorun olması gerektiğini düşündüm.

Tekrarlayan testlerden sonra, System.Environment.CurrentDirectory'nin gerçekten mevcut dizini almak için kullanıldığı tespit edildi; ancak program A program B'yi çağırır ve program B dizini almak için System.Environment.CurrentDirectory kullanırsa. O zaman B programında elde edilen dizin, B uygulamasının bulunduğu dizin artık değildir; A'nın bulunduğu dizin haline gelir. Açıldığımda açılan dizinin C:\Windows\System32 olduğunu bulmak zor değil çünkü önyükleme kendi kendine başlatma programı da Windows'ta bir süreç tarafından çağrılıyor.

Bu nedenle, winform programı mevcut uygulamanın bulunduğu dizini almak istiyorsa, System.Environment.CurrentDirectory kullanmamak en iyisidir. Bunun yerine: Application.StartupPath Bu şekilde, kim çağırırsa çağırsın, fark etmez.

Test kodu:




Transfer edilenler:Bağlantı girişi görünür.




Önceki:K8S ağ flanel ve kaliko karşılaştırması
Önümüzdeki:C#, referans kütüphane DLL'lerini probing yoluyla alt klasörlere yerleştirir
 Ev sahibi| Yayınlandı 10.11.2020 15:08:26 |
C#, mevcut program çalıştırma yolunu almak için bir tür metod koleksiyonudur

Mevcut sürece giden tam yol, dosya adı (süreç adı) dahil olmak üzere alın.
string str = bu. GetType(). Montaj. Konum;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Yeni Süreç bileşenini alan ve onu mevcut süreçle ilişkilendiren ana modüle giden tam yol, dosya adı (süreç adı) dahil.
string str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

Mevcut iş parçacığının mevcut uygulama alanının temel dizinini alır; bu dizin, assembly çatışma çözücü tarafından assembly incelenmesi için kullanılır.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Uygulamayı içeren dizinin adını alın ve ayarlayın. (Tavsiye edilir)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Uygulamayı başlatan çalıştırılabilir dosyanın yolunu alın, çalıştırılabilir dosyanın adı hariç.
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Uygulamanın mevcut çalışma dizinini alın (güvenilmez).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Yayınlandı 22.09.2021 20:38:52 |
Öğrenmeyi öğren...
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com