2010-06-18 26 views
7

Tôi có một ứng dụng WPF được cài đặt trên máy khách thông qua Trình cài đặt Windows. Ứng dụng này cũng đăng ký phần mở rộng tệp (.xyz), vì vậy khi người dùng nhấp đúp vào một tệp, nó sẽ mở ứng dụng WPF của tôi và hiển thị tệp (như Microsoft Word). Chương trình này cũng có rất nhiều tệp không được đánh dấu là tệp tài nguyên hoặc nội dung mà tệp sử dụng (hướng dẫn sử dụng, bản vẽ một phần, v.v.).Danh mục công việc WPF

Sự cố xảy ra khi người dùng nhấp đúp vào tệp .xyz và nó sẽ mở ứng dụng WPF. Ứng dụng hiện có thư mục làm việc của thư mục chứa tệp .xyz. Bây giờ chương trình không thể tìm thấy bất kỳ tập tin nào (hướng dẫn sử dụng, bản vẽ một phần, vv) mà nó cần.

Cách tốt nhất để xử lý loại vấn đề này là gì? Tôi có thể thiết lập thư mục làm việc (Environment.CurrentDirectory), nhưng hộp thoại mở tập tin của tôi thay đổi thư mục làm việc khi người dùng lưu hoặc mở tệp .xyz. Tôi có thể sử dụng một gói uri cho các bản vẽ một phần, nhưng tôi sử dụng Process.Start cho các hướng dẫn sử dụng bởi vì chúng là một PDF. Tôi đã thử tìm kiếm, nhưng không thể nghĩ ra được.

Trả lời

5

Bạn sẽ có thể để có được vào thư mục cài đặt của bạn, hoặc bằng cách tìm thư mục của thực thi hoặc bằng cách sử dụng phản ánh để tìm thư mục của một assemly:

Bằng cách tìm thực thi, bạn có thể thêm tham chiếu vào Windows.Forms để thực hiện công việc này (phải thừa nhận là không lý tưởng):

using System.IO; 
using System.Windows.Forms; 

string appPath = Path.GetDirectoryName(Application.ExecutablePath); 

Sử dụng phản ánh:

using System.IO; 
using System.Reflection; 

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

Hoặc

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

Bạn có thể có lẽ chỉ bộ nhớ cache con đường onload của ứng dụng của bạn vì nó sẽ không thay đổi.

+0

Application.ExecutablePath không tồn tại trong WPF, vì vậy tôi sử dụng phản ánh. Điều này làm việc cho các tập tin PDF và đối với các tập tin hình ảnh, tôi đang sử dụng một gói URI. Nó chỉ có vẻ như sẽ có một cách tốt hơn để xử lý scenerio này. – awilinsk

+0

Đã thêm phương thức thay thế ... – brendan

+0

Khi [liên kết này] (http://stackoverflow.com/a/948438/419348) cho biết, 'System.Reflection.Assembly.GetExecutingAssembly(). Vị trí' có thể nhận được vị trí sau 'shadow-copy'. – AechoLiu

1

Một điều bạn có thể muốn làm là chỉ cần đặt lại thư mục làm việc hiện tại khi khởi động.

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

Điều đó sẽ giúp bạn bình phương.

-1

Chỉ trong trường hợp bạn cần phải quấn bộ não của bạn xung quanh chỉ nhận được một con đường, tôi để lại cho bạn với ví dụ của tôi. Tôi đã sử dụng tên của dự án để theo dõi cách phá vỡ chuỗi đường dẫn đầy đủ. Tôi thậm chí sẽ rời khỏi dòng ban đầu, vì vậy bạn có thể hiểu được quá trình suy nghĩ.

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

Tôi biết đây là công cụ cơ bản, nhưng tôi đã nghỉ việc một vài tháng và đôi khi rất vui khi được trợ giúp một chút với nội dung hiển nhiên.

2

Có sự khác biệt giữa vị trí của hội và thư mục làm việc của ứng dụng. Đôi khi những điều này có thể giống nhau, nhưng điều này không phải là trường hợp. Để thay đổi thư mục làm việc, bạn có thể thực thi ứng dụng của mình từ cmd.exe hoặc chỉ tạo một lối tắt với một thư mục khác trong thuộc tính Start in.

Bạn có thể nhận được thư mục làm việc của ứng dụng như thế này:

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

Lưu ý: Các . -Directory luôn là mục làm việc hiện tại, chúng tôi chỉ nhận được đường dẫn tuyệt đối với nó. Đôi khi bạn có thể không cần đường dẫn tuyệt đối. Ví dụ, nếu bạn muốn đọc một tập tin trong thư mục làm việc:

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

hoặc thậm chí:

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

Tại sao tất cả các câu trả lời khác lại được ưa chuộng? Cái này là cái duy nhất đúng. Tất cả những người khác cung cấp cho Vị trí của tệp thực thi thay vì thư mục làm việc. – marc40000

0
Path.GetDirectoryName(Application.ResourceAssembly.Location) 
Các vấn đề liên quan