2008-11-05 35 views
7

Vì vậy, ... Tôi đã từng nghĩ rằng khi bạn truy cập một tệp nhưng đã chỉ định tên mà không có đường dẫn (CAISLog.csv trong trường hợp của tôi). NET sẽ mong đợi tệp nằm ở cùng một đường dẫn như .exe.Độ phân giải đường dẫn mặc định/tương đối hoạt động như thế nào trong .NET?

Điều này hoạt động khi tôi bước qua một giải pháp (C# .NET2. * VS2K5) nhưng khi tôi chạy ứng dụng ở chế độ bình thường (Bắt đầu bằng màn hình kích hoạt MQ Websphere & chạy dưới nền) truy cập vào tập tin tại đường dẫn nơi .exe là nó đang được tìm kiếm tại C: \ WINDOWS \ system32. Nếu nó quan trọng .exe của tác vụ phụ nằm trong cùng cấu trúc thư mục/đường dẫn như ứng dụng của tôi

Tôi nhận được lỗi trùng khớp: "System.UnauthorizedAccessException: Truy cập vào đường dẫn 'C: \ WINDOWS \ system32 \ CAISLog. csv 'bị từ chối. "

Giải pháp thay thế của tôi chỉ đủ điều kiện cho vị trí tệp của tôi. Những gì tôi muốn hiểu, tuy nhiên là "Quy tắc .NET điều chỉnh cách đường dẫn được giải quyết khi chỉ tên tệp được chỉ định trong IO là gì?" Tôi cảm thấy tôi thiếu một số khái niệm cơ bản và nó làm tôi xấu.

chỉnh sửa - Tôi không chắc đó là quy tắc của .NET, nhưng Schmuli có vẻ đang giải thích khái niệm rõ ràng hơn một chút. Tôi chắc chắn sẽ cố gắng đề xuất của Rob Prouse trong tương lai vì vậy +1 trên đó quá.

Nếu có ai đó có một số gợi ý về từ ngữ nhấn mạnh tôi không thực sự quan tâm đến việc tìm đường dẫn đến .exe của tôi - thay vì không hiểu điều gì đang xảy ra với độ phân giải đường dẫn tương đối (và tôi vẫn có thể có thuật ngữ của tôi hơi say) ...

Trả lời

10

Khi một ứng dụng (WinForms) khởi động, các Environment.CurrentDirectory chứa đường dẫn đến thư mục ứng dụng (ví dụ: thư mục chứa các lắp ráp .exe). Sử dụng bất kỳ Hộp thoại Tệp nào, ví dụ: OpenFileDialog, SaveFileDialog, v.v. sẽ làm cho thư mục hiện tại thay đổi (nếu một thư mục khác được chọn).

Khi chạy Dịch vụ Windows, thư mục chứa của nó là C: \ Windows \ System32, vì đó là thư mục Hệ thống và đó là Hệ thống (tức là Hệ điều hành) đang thực sự chạy Dịch vụ Windows của bạn.

Lưu ý rằng việc chỉ định đường dẫn tương đối trong hầu hết các đối tượng System.IO, sẽ quay trở lại sử dụng thuộc tính Environment.CurrentDirectory.

Như đã đề cập, có một số cách để có được những đường dẫn của dịch vụ thực thi, sử dụng Assembly.GetEntryAssembly() hoặc Assembly.GetExecutingAssembly() và sau đó sử dụng một trong hai Location tài sản hoặc CodeBase tài sản (lưu ý rằng đây là con đường tập tin, không thư mục, của thực thi).

Một lựa chọn khác là sử dụng:

`System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);` 

Làm cho cuộc gọi trong phương pháp OnStart sử dụng Dịch Vụ, áp dụng nó cho toàn bộ ứng dụng.

+0

Cảm ơn - Tôi nghĩ điều này giúp ích nhiều nhất –

4

Độ phân giải đường dẫn tương đối không bao giờ hoạt động trên đường dẫn của tệp thực thi. Nó luôn hoạt động chống lại quá trình 'Danh mục hiện tại, và bạn thực sự không thể mong đợi rằng luôn luôn được đặt vào thư mục .exe sống trong.

Nếu bạn cần hành vi đó, hãy cẩn thận để tìm ra con đường đúng trên của riêng bạn và cung cấp một đường dẫn đầy đủ điều kiện cho các hoạt động tập tin.

9

Nó dựa trên thư mục làm việc hiện tại có thể hoặc không giống như nơi ứng dụng của bạn cư trú, đặc biệt nếu bắt đầu từ một chương trình khác hoặc lối tắt với thư mục làm việc khác.

Thay vì mã cứng đường dẫn, hãy lấy đường dẫn đến chương trình của bạn và sử dụng nó. Bạn có thể làm điều này với một cái gì đó như thế này

Assembly ass = Assembly.GetEntryAssembly(); 
string dir = Path.GetDirectoryName(ass.Location); 
string filename = Path.Combine(dir, "CAISLog.csv"); 

Điều này giả định rằng hội nhập là nơi tệp của bạn. Nếu không, bạn có thể thay đổi lên việc lắp ráp cho một cái gì đó như;

Assembly ass = Assembly.GetAssembly(typeof(AClassInYourAssembly)); 
+2

Nếu tôi nhớ chính xác, Assembly.Location sẽ trả lại đường dẫn đầy đủ đến assembly, tức là bao gồm cả tên tệp. Vì vậy, bạn sẽ phải gọi Path.GetDirectoryName (ass.Location) để thực sự nhận được thư mục. Ngoài ra, +1 cho câu trả lời. – OregonGhost

+0

Cảm ơn bạn, Rob - những thứ hữu ích nhưng tôi nghĩ rằng câu trả lời của Schmuli đã cung cấp cái nhìn sâu sắc hơn về khái niệm chung về những gì đã làm tôi khó chịu. +1 –

-2

Bạn có thể sử dụng điều này để chỉ định đường dẫn nằm ở cùng một đường dẫn của exe @ ".. \ CAISLog.csv". Xin lưu ý rằng các dấu chấm kép đề cập đến thư mục cha mẹ của nơi mà .exe của bạn nằm.

RWendi

Các vấn đề liên quan