2010-06-29 46 views
30

Tôi đang sử dụng Path.Combine như vậy:Làm cách nào để lấy Path.Combine của .NET để chuyển đổi dấu gạch chéo về phía trước thành dấu gạch chéo ngược?

Path.Combine("test1/test2", "test3\\test4"); 

Kết quả tôi nhận được là:

test1/test2\test3\test4 

Chú ý cách dấu gạch chéo không được chuyển đổi sang một dấu gạch chéo. Tôi biết tôi có thể làm string.Replace để thay đổi nó, nhưng có cách nào tốt hơn để làm điều này?

+3

Có phải dấu gạch chéo ngược là vấn đề không? API tệp .NET và Windows chấp nhận một trong hai. –

+0

Sự cố với dấu gạch chéo hỗn hợp là gì? Vanity? – JBRWilkinson

+4

@ John, vâng có: http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx. Hoặc là bạn đang cố gắng để được pedantic về sự khác biệt giữa C# và NET? –

Trả lời

18

Bởi vì "test1/test2" của bạn đã là một chuỗi chữ, Path.Combine sẽ không thay đổi '/' cho bạn thành '\'.

Path.Combine sẽ chỉ concat 2 xâu với delimiter con đường thích hợp được sử dụng bởi hệ điều hành, trong trường hợp này Windows, đó là '\', từ đó đầu ra của bạn

test1/test2\test3\test4 

Đặt cược của bạn tốt nhất là là string.Replace.

+22

Cảm ơn. Ngoài ra, tôi phát hiện ra rằng 'Path.GetFullPath()' cũng sẽ thay thế dấu gạch chéo bằng dấu gạch chéo ngược. –

+0

Thật tuyệt, tôi không biết điều đó, nhưng tôi chắc chắn sẽ ghi lại nó. – Riaan

+3

Sau khi kết hợp, bạn có thể thay thế tất cả các loại dấu gạch chéo bằng 'Path.DirectorySeparatorChar'. –

11

Hãy thử sử dụng lớp Uri. Nó sẽ tạo Uris hợp lệ cho đúng máy đích (/ ->\).

+0

Vâng, điều này hoạt động. Chỉ cần tạo 'URI mới (đường dẫn)' và nó tự động chuyển thành dấu gạch chéo ngược. Nice – Edgar

+0

Công trình này: 'mới Uri (@" c:/temp \ test/"). LocalPath' –

2

Trước tiên, tôi sẽ tranh luận trong trường hợp cụ thể này, nó sẽ không có bất hợp lý để làm một .Replace đơn()

Thứ hai, bạn cũng có thể sử dụng System.Uri để định dạng đường dẫn của bạn, nó rất nghiêm ngặt. Tuy nhiên, điều này sẽ có nhiều dòng hơn một đơn giản .Replace(). Tôi đang bầu chọn cho bạn để sử dụng .Replace() được thực hiện với nó! Hy vọng rằng sẽ giúp

-3

Không, ký tự seperator được định nghĩa là Chỉ đọc.

http://msdn.microsoft.com/en-us/library/system.io.path.pathseparator.aspx

Bạn nên sử dụng Thay thế vì đó là thay đổi nhỏ.

+1

Bạn đang nói về cái gì? Thậm chí giả sử bạn có nghĩa là 'DirectorySeparator', anh ta đang cố gắng thay đổi nó trong chuỗi của mình, chứ không phải giá trị được hệ thống sử dụng. – Gabe

1

Sử dụng .NET Reflector, bạn có thể nhìn thấy Path.Combine mà không làm thay đổi dấu gạch chéo trong chuỗi cung cấp

public static string Combine(string path1, string path2) 
{ 
    if ((path1 == null) || (path2 == null)) 
    { 
     throw new ArgumentNullException((path1 == null) ? "path1" : "path2"); 
    } 
    CheckInvalidPathChars(path1); 
    CheckInvalidPathChars(path2); 
    if (path2.Length == 0) 
    { 
     return path1; 
    } 
    if (path1.Length == 0) 
    { 
     return path2; 
    } 
    if (IsPathRooted(path2)) 
    { 
     return path2; 
    } 
    char ch = path1[path1.Length - 1]; 
    if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar)) 
    { 
     return (path1 + DirectorySeparatorChar + path2); 
    } 
    return (path1 + path2); 
} 

Bạn có thể làm tương tự với String.Replace và các phương pháp lớp Uri để xác định cái nào hoạt động tốt nhất cho bạn.

+0

Lưu ý rằng 'DirectorySeparatorChar = '\\'' và 'AltDirectorySeparatorChar = '/'' – Greg

65

Như những người khác đã nói, Path.Combine không thay đổi dấu phân cách. Tuy nhiên nếu bạn chuyển nó sang một đường dẫn đầy đủ:

Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4")) 

kết quả đầy đủ đường dẫn sẽ sử dụng các dấu phân cách thư mục tiêu chuẩn (dấu chéo ngược dành cho Windows).

+1

Hoạt động nhưng hãy cẩn thận vì GetFullPath() sẽ sửa các đường dẫn tương đối và biến nó thành đường dẫn đầy đủ. Nếu bạn cần giữ lại một đường dẫn tương đối, GetFullPath() sẽ không hoạt động. –

+0

Không hoạt động, đường dẫn không thay đổi (mono) – George

+0

@George, bạn có chắc chắn: mono trên hệ điều hành nào? Phân tách đường dẫn tiêu chuẩn cho phiên bản mono của bạn (Path.DirectorySeparatorChar) là gì? – Joe

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