2010-06-18 16 views
7

İstemci makinede Windows Installer aracılığıyla yüklenen bir WPF uygulamasına sahibim. Bu uygulama ayrıca bir dosya uzantısı (.xyz) kaydeder, böylece kullanıcı bir dosyayı çift tıklattığında, WPF uygulamamı açar ve dosyayı (Microsoft Word gibi) görüntüler. Bu programda, kullandığı kaynak veya içerik dosyaları olarak işaretlenmeyen bir ton dosya da vardır (kullanım kılavuzları, parça resimleri vb.).WPF Çalışma Dizini

Kullanıcı, bir .xyz dosyasını çift tıklattığında ve WPF uygulamasını açtığınızda sorun ortaya çıkar. Uygulama şimdi .xyz dosyasının bulunduğu dizinin bir çalışma dizinine sahiptir. Artık program ihtiyaç duyduğu dosyaları (kullanım kılavuzlarını, parça çizimlerini, vb.) Bulamıyor.

Bu tür sorunların üstesinden gelmenin en iyi yolu nedir? Çalışma dizinini (Environment.CurrentDirectory) ayarlayabilirim, ancak açık dosya iletişim kutusum, kullanıcı bir .xyz dosyasını kaydettiğinde veya açtığında çalışma dizinini değiştirir. Parça çizimleri için bir paket uri kullanabilirdim, ancak PDF'ler oldukları için kullanım kılavuzları için Process.Start'ı kullanıyorum. Aramayı denedim, ama hiçbir şeyle gelemedim.

cevap

5

çalıştırılabilir, bu işi yapmak için Windows.Forms'a bir başvuru ekleyebilirsiniz (kuşkusuz ideal değil):

kullanma yansıtma: değişmeyecektir olarak

using System.IO; 
using System.Reflection; 

string path = Path.GetDirectoryName(Assembly.GetAssembly(typeof(MyClass)).CodeBase); 

Ya

string path = System.Reflection.Assembly.GetExecutingAssembly().Location; 

Muhtemelen sadece uygulamanızın o yolun onload önbelleğe alabilir.

+0

Application.ExecutablePath WPF yok, bu yüzden yansıma kullandı. Bu PDF dosyaları için çalışır ve Resim dosyaları için bir paket URI kullanıyorum. Bu senaryoyu ele almanın daha iyi bir yolu olacak gibi görünüyor. – awilinsk

+0

Alternatif bir yöntem eklendi ... – brendan

+0

[bu bağlantı] (http://stackoverflow.com/a/948438/419348) 'de belirtildiği gibi, 'System.Reflection.Assembly.GetExecutingAssembly(). 'gölge copying'. – AechoLiu

1

Yapmak isteyebileceğiniz başka bir şey, başlangıçta geçerli çalışma dizinini sıfırlamaktır.

Directory.SetCurrentDirectory(GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); 

Bu, sizi yukarı çıkaracak.

-1

Beyninizi sadece bir yolun etrafına sarmanız gerekiyorsa, sizi örnekle bırakıyorum. Tam yol dizesini ayırmak için projenin adını kullandım. Orijinal çizgiden bile ayrılacağım, bu yüzden düşünce sürecini anlayabilirsiniz.

var filepath = System.Reflection.Assembly.GetExecutingAssembly().Location; 
var rootindex = filepath.IndexOf("TestProject\\"); 
var wordlength = "TestProject".Count(); 
var rootpath = filepath.Remove(rootindex + wordlength); 
sDir = filepath.Remove(rootindex + wordlength); 
//sDir = "c:\\dev\\Test_Solution\\TestProject"; 

bu temel şeyler olduğunu biliyorum, ama birkaç aydır görevde kapalı oldum ve bazen bariz şeyler için biraz yardıma olması güzel.

2

Montaj yeri ile uygulamanın çalışma dizini arasında bir fark var. Bazen bunlar aynı olabilir, ancak durum böyle olmamalı. Çalışma dizini değiştirmek için uygulamanızı cmd.exe'dan yürütebilir veya yalnızca Start in Mülk'te farklı bir dizine sahip bir kısayol oluşturabilirsiniz.

Böyle Uygulama çalışma dizinini alabilirsiniz:

System.IO.Path.GetFullPath(".") 

Not:. -Dizin Geçerli çalışma Dizin daima, sadece bunun mutlak yolunu olsun. Bazen mutlak yola ihtiyacın olmayabilir. Hatta

new StreamReader("./file-in-the-working-directory.txt"); 

ya: Örneğin çalışma dizininde bir dosyayı okumak istiyorsanız

new StreamReader("file-in-the-working-directory.txt"); 
+1

Neden diğer tüm cevaplar destekleniyor? Bu tek doğru olanı. Diğerleri, çalışma dizini yerine yürütülebilir dosyanın yerini verir. – marc40000

0
Path.GetDirectoryName(Application.ResourceAssembly.Location) 
İlgili konular