2010-05-06 3 views
6

Có thể sử dụng lớp System.IO.Path hay một đối tượng tương tự để định dạng đường dẫn kiểu unix, cung cấp chức năng tương tự cho lớp PATH không? Ví dụ, tôi có thể làm:System.IO.Path hoặc sử dụng tương đương với đường dẫn Unix

Console.WriteLine(Path.Combine("c:\\", "windows")); 

nào cho thấy:

"C:\\windows" 

Nhưng tôi cố gắng một điều tương tự với dấu gạch chéo (/) nó chỉ đảo ngược chúng cho tôi.

Console.WriteLine(Path.Combine("/server", "mydir")); 

nào cho thấy:

"/server\\mydir" 

Trả lời

3

Trong trường hợp này tôi sẽ sử dụng lớp System.Uri hoặc System.UriBuilder.

Lưu ý phụ: Nếu bạn chạy mã .NET của mình trên Hệ thống Linux với Mono-Runtime, lớp Đường dẫn sẽ trả về hành vi mong đợi của bạn. Thông tin mà lớp Path sử dụng được cung cấp bởi hệ thống bên dưới.

+0

Cảm ơn điều đó, nhưng tôi không thể tìm thấy bất kỳ phương pháp nào trong các lớp này có vẻ là tương đương của .Combine()? –

+0

Tôi không tìm thấy phương pháp này hữu ích ... Yêu cầu định dạng URI. UriFormatException: URI không hợp lệ: Không thể xác định định dạng của URI: Mẫu/1024x768 / –

3

Bạn gặp sự cố lớn hơn, Unix chấp nhận các ký tự trong tên tệp mà Windows không cho phép. Mã này sẽ ném bom với ArgumentException, "Ký tự không hợp lệ trong đường dẫn":

string path = Path.Combine("/server", "accts|payable"); 

Bạn không thể sử dụng Path.Combine() một cách đáng tin cậy cho đường dẫn Unix.

3

Path.Combine sử dụng các giá trị của Path.DirectorySeperatorCharPath.VolumeSeparatorChar, và chúng được xác định bởi các thư viện lớp trong thời gian chạy - vì vậy nếu bạn viết mã của bạn chỉ sử dụng Path.Combine cuộc gọi, Environment.SpecialFolder giá trị, và vân vân, nó sẽ chạy tốt ở khắp mọi nơi, kể từ Mono (và có lẽ là bất kỳ thời gian chạy .NET nào) thực hiện phương thức gốc để nhận và xây dựng các đường dẫn đó cho bất kỳ nền tảng nào mà nó chạy trên đó. (Ví dụ thứ hai của bạn, ví dụ, trả /server/mydir đối với tôi, nhưng ví dụ đầu tiên cho c:\/windows)

Nếu bạn muốn có một con đường UNIX cụ thể mã hóa cứng trong mọi trường hợp, Path.Combine không được mua bạn bất cứ điều gì: Console.WriteLine ("/server/mydir"); làm những gì bạn muốn trong OP. Tuy nhiên, theo Hans, các hệ thống tệp khác nhau có các quy tắc khác nhau cho các ký tự được phép, độ dài đường dẫn và v.v., vì vậy thực hành tốt nhất, giống như với bất kỳ chương trình nền tảng nào, là hạn chế sử dụng giao điểm của các tính năng được phép giữa các hệ thống tệp bạn đang nhắm mục tiêu. Xem các vấn đề về độ nhạy trường hợp quá.