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