2009-06-26 34 views
49

Cách tốt nhất để kết hợp đường dẫn với tên tệp là gì?Cách tốt nhất để kết hợp đường dẫn và tên tệp trong C# /. NET là gì?

Tức là, được cung cấp c:\foobar.txt, tôi muốn c:\foo\bar.txt.

Cho c:\foo..\bar.txt, tôi muốn lỗi hoặc c:\foo\bar.txt (vì vậy tôi không thể sử dụng trực tiếp Path.Combine()). Tương tự cho c:\foobar/baz.txt, tôi muốn có lỗi hoặc c:\foo\baz.txt (không phải c:\foo\bar\baz.txt).

Tôi nhận ra, tôi có thể kiểm tra rằng tên tệp không chứa '\' hoặc '/', nhưng điều đó có đủ không? Nếu không, kiểm tra chính xác là gì?

Trả lời

83

Nếu bạn muốn "xấu" tên tập tin để tạo ra lỗi:

if (Path.GetFileName(fileName) != fileName) 
{ 
    throw new Exception("'fileName' is invalid!"); 
} 
string combined = Path.Combine(dir, fileName); 

Hoặc, nếu bạn chỉ muốn sửa âm thầm tên tệp "xấu" mà không cần thoát ception:

string combined = Path.Combine(dir, Path.GetFileName(fileName)); 
+9

Đối với những người chưa quen thuộc với khung công tác, bạn cần một 'using System.IO;' gọi trong tệp của bạn để truy cập vào 'Đường dẫn'. –

+2

Lưu ý rằng 'Path.Combine' sẽ ném một' ArgumentNullException' nếu một trong các đối số của nó là 'null'. Bạn ** có thể ** chuyển một chuỗi trống cho một trong hai đối số –

+2

Lưu ý: Path.Combine thường sẽ thêm dấu phân cách giữa mỗi đường dẫn nếu cần. Tuy nhiên, Path.Combine ("C:", "file.txt"), trả về "C: file.txt", mà không phải là một đường dẫn hợp lệ. – ConditionRacer

16

Bạn có thể sử dụng:

Path.Combine(folder, Path.GetFileName(fileName)) 

hay, để bỏ ra \ (không kiểm tra, có thể Path.GetFileName xử lý này sẽ tự động)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\"))) 
+4

Cảm ơn! Chỉ cần FYI: Thay thế là không cần thiết. –

1

Hãy nhận biết rằng khi bạn sử dụng Path.Combine(arg1, arg2) - nếu người dùng của bạn đầu vào một đường dẫn tập tin đủ điều kiện cho arg2 nó sẽ bỏ qua arg1, arg2 và sử dụng như con đường.

Theo ý kiến ​​của tôi, Microsoft đã sửa lỗi đó! Điều này có thể khiến bạn mở rộng với người dùng hack toàn bộ hệ thống tệp của bạn. Được cảnh báo, đọc bản in đẹp! Nếu bạn đang kết hợp đường dẫn sử dụng: var newPath = path1 + @"\" + path2; đơn giản hơn và không có kết quả ngoài mong đợi ...

+0

Đường dẫn đầy đủ ở bên phải được trả lại do kết quả của việc kết hợp các đường dẫn tương đối là kết quả chính xác và hợp lệ. –

+1

Bất kể nếu kết quả đúng và hợp lệ, quá nhiều dev bị thiếu thực tế là nếu trong mã arg1 của chúng là đường dẫn thư mục và arg2 là đầu vào của người dùng, thì đường dẫn tuyệt đối được nhập vào arg2 sẽ là kết quả đầu ra. Làm cho nó quá dễ dàng để mở ra theo ý kiến ​​của tôi là tồi tệ nhất của hack ứng dụng web .. mã/shell tiêm ... Kiểm tra guys đầu vào của bạn. – Cyassin

+0

Theo ý kiến ​​của tôi, bất kỳ nhà phát triển nào cho rằng người dùng có thể nhập đường dẫn mà không kiểm tra bất cứ thứ gì - đều đáng bị hack. Đây là công cụ Day One và Path.Combine không được thiết kế để hoạt động theo cách bạn nghĩ - nó là một cách tốt và mạnh mẽ để tránh phải kiểm tra dấu gạch chéo ngược, thực sự được dùng để sử dụng nội bộ bởi mã của bạn, không phải là giao diện người dùng để bảo mật tệp của bạn. Tài liệu cho nó khá hoàn chỉnh - chỉ cần đọc nó. – jinzai

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