2012-10-17 26 views
11

Cách tốt nhất để kiểm tra sự tồn tại của tệp bằng đường dẫn tương đối là gì.Kiểm tra sự tồn tại của tệp bằng đường dẫn tương đối

Tôi đã sử dụng phương pháp sau nhưng nó trả về false mặc dù thực tế là tệp hiện có.

bool a = File.Exists("/images/Customswipe_a.png"); 
+0

liên quan đến đường dẫn thực hiện? Ngoài ra, nếu đây không phải là web, tại sao bạn đang sử dụng '/' insteaed của '\\' –

+0

Bạn có cơ hội bỏ lỡ thẻ "asp.net" và cần Server.MapPath thay vào đó? –

Trả lời

10

Đó không phải là đường dẫn tương đối. Bạn cần phải thoát ra khỏi số / đầu tiên nếu không nó sẽ được hiểu là bắt nguồn (tức là C:/images ...)

+7

Đó là đường dẫn tương đối về mặt kỹ thuật, chỉ liên quan đến ổ đĩa hiện tại. –

+0

@AlexeiLevenkov Có thể về mặt kỹ thuật, vâng. Nhưng tại sao phân biệt giữa các đường dẫn tuyệt đối và tương đối nếu tất cả chúng đều liên quan đến một thứ gì đó? – climbage

+0

Định nghĩa của tôi là "nếu đường dẫn đề cập đến cùng một tệp không phân biệt cấu hình môi trường" (cũng khác với 'Path.IsPathRooted' là một cách khác để xem xét nó). Tôi gặp khó khăn khi gọi đường dẫn "\ p \ f.txt" tuyệt đối vì nó có thể tham chiếu đến "c: \ p \ f.txt" hoặc "d: \ p \ f.txt" tùy thuộc vào đường dẫn hiện tại ... "c : \ path \ file.txt "hoặc" \\ server \ path \ file.txt "trông tuyệt đối hơn với tôi. –

0

Đường dẫn có liên quan đến vị trí tệp nhị phân của bạn. Trong trường hợp dự án studio trực quan, điều này sẽ là %PROJECTDIR%/bin/(RELEASE||DEBUG)/

Điều tôi sẽ làm là đặt gốc hệ thống tệp vào tệp cấu hình và sử dụng nó cho đường dẫn tương đối của bạn.

3

Đường dẫn tương đối liên quan đến thư mục làm việc hiện tại. Nó có thể không phải là thư mục ứng dụng. Hãy gọi GetCurrentDirectory() để kiểm tra đường dẫn thực tế bạn đang thử nghiệm.

1

Đường dẫn tương đối, là tương đối cho thứ gì đó. Trong API này, nó sẽ, theo các tài liệu File.Exists:

thông tin đường dẫn tương đối được hiểu là tương đối so với thư mục làm việc hiện tại .

Vì vậy, mọi thứ ở đây phụ thuộc vào CurrentDirectoty tại thời điểm thực hiện truy vấn này.

Ngoài ra, đường dẫn của bạn không hợp lệ Đường dẫn trên màn hình (Tôi giả sử bạn chọn nó từ một số tệp web hoặc kiến ​​thức). Để hiểu nếu đường dẫn được chỉ định không chứa các ký tự hợp lệ, hãy sử dụng chức năng GetInvalidCharacters.

Trong trường hợp cụ thể của bạn, sẽ đủ để sử dụng @"\images\Customswipe_a.png".

+0

Nó hợp lệ đối với các API .Net, khác thường khi sử dụng "/" thay vì "\", nhưng hợp lệ. Và 'Path.GetInvalidPathChars(). Chứa ('/')' không báo cáo "/" là không hợp lệ ... –

+0

@AlexeiLevenkov: Tôi không nói cho .NET API, tôi nói như đường dẫn ứng dụng Desktop. – Tigran

5

Tôi đoán rằng bạn đang chạy mã này trong ứng dụng asp.net, đó là lý do tại sao bạn nhận được sai.

Trong asp.net, bạn nên sử dụng Server.MapPath("/images/Customswipe_a.png") để nhận đường dẫn "đúng" (liên quan đến thư mục gốc của ứng dụng web). Nếu không, bạn sẽ nhận được đường dẫn cục bộ đến máy chủ web thực thi (IIS/WEBDAV/.. tên khác).

0

Trong một ứng dụng WinForms bạn có thể nhận được thư mục của file exe với

string directory = 
    Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); 

Một giải pháp khác sử dụng Reflection

string directory = 
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
2

Bạn chỉ cần xác định những tập tin của bạn là tương đối so với

  • Lắp ráp ứng dụng chính của bạn?
  • Thư mục hiện tại?
  • Thư mục dữ liệu ứng dụng?
  • đặt tên là ...

Trong mỗi trường hợp này tôi muốn đề nghị bạn chuyển đổi nó thành một đường dẫn tuyệt đối bởi Path.Combine phương pháp:

public static readonly string AppRoot = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 

... 

//calling with a '/' heading makes the path absolute so I removed it 
var fullPath = Path.Combine(AppRoot, "images/Customswipe_a.png"); 
var exists = File.Exists(fullPath); 

Bằng cách này bạn có thể đảm bảo nơi bạn đang tìm kiếm. Ngay cả hộp thoại Mở/Lưu tệp có thể thay đổi thư mục hiện tại của bạn. Vì vậy, gọi số File.Exists mà không có đường dẫn đầy đủ thường là một quyết định sai lầm.

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