2009-03-08 27 views
8

Tương đương với PathCanonicalize trong C# là gì?Đường dẫnKích thước tương đương trong C#

Sử dụng: Tôi cần thực hiện dự đoán tốt cho dù hai đường dẫn tệp tham chiếu đến cùng một tệp (không có quyền truy cập đĩa). Cách tiếp cận điển hình của tôi đã ném nó qua một vài bộ lọc như MakeAbsolute và PathCanonicalize, và sau đó thực hiện so sánh phân biệt dạng chữ.

Trả lời

12

nhanh chóng và dơ bẩn:

Trong quá khứ tôi đã tạo ra một đối tượng FileInfo từ chuỗi đường dẫn và sau đó sử dụng tài sản FullName. Thao tác này sẽ xóa tất cả các tệp .. \ 's và. \' S.

Tất nhiên bạn có thể interop:

[DllImport("shlwapi", EntryPoint="PathCanonicalize")] 
    private static extern bool PathCanonicalize(
     StringBuilder lpszDst, 
     string lpszSrc 
    ); 
5

3 giải pháp:

kịch bản trường hợp tốt nhất, bạn đang ở đâu chắc chắn 100% quá trình gọi điện thoại sẽ có quyền truy cập đầy đủ vào hệ thống tập tin. caveat: phép trên hộp sản xuất có thể được khôn lanh

public static string PathCombineAndCanonicalize1(string path1, string path2) 
    { 
     string combined = Path.Combine(path1, path2); 
     combined = Path.GetFullPath(combined); 
     return combined; 
    } 

Nhưng, chúng tôi không phải lúc nào miễn phí. Thường thì bạn cần phải thực hiện chuỗi số học mà không được phép. Có một cuộc gọi riêng cho việc này. caveat: khu nghỉ mát để gọi mẹ đẻ

public static string PathCombineAndCanonicalize2(string path1, string path2) 
    { 
     string combined = Path.Combine(path1, path2); 
     StringBuilder sb = new StringBuilder(Math.Max(260, 2 * combined.Length)); 
     PathCanonicalize(sb, combined); 
     return sb.ToString(); 
    } 

    [DllImport("shlwapi.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool PathCanonicalize([Out] StringBuilder dst, string src); 

Một chiến lược thứ ba là để lừa CLR. Path.GetFullPath() hoạt động tốt trên một con đường hư cấu, vì vậy chỉ cần chắc chắn rằng bạn luôn luôn cho nó một. Những gì bạn có thể làm là trao đổi trên các gốc với một đường dẫn UNC giả mạo, hãy gọi GetFullPath(), và sau đó trao đổi một thực trở lại trong caveat:. này có thể đòi hỏi một bán khó khăn trong xét mã

public static string PathCombineAndCanonicalize3(string path1, string path2) 
    { 
     string originalRoot = string.Empty; 

     if (Path.IsPathRooted(path1)) 
     { 
      originalRoot = Path.GetPathRoot(path1); 
      path1 = path1.Substring(originalRoot.Length); 
     } 

     string fakeRoot = @"\\thiscantbe\real\"; 
     string combined = Path.Combine(fakeRoot, path1, path2); 
     combined = Path.GetFullPath(combined); 
     combined = combined.Substring(fakeRoot.Length); 
     combined = Path.Combine(originalRoot, combined); 
     return combined; 
    }