2009-03-08 27 views
8

C# içinde PathCanonicalize eşdeğeri nedir?PathCanonicalize C içinde eşdeğeri #

Kullanım: İki dosya yolunun aynı dosyaya (disk erişimi olmadan) başvurup başvurmadığını iyi tahmin etmem gerekiyor. Benim tipik yaklaşımım, MakeAbsolute ve PathCanonicalize gibi birkaç filtreye atıyor ve sonra da büyük/küçük harf duyarlı olmayan bir karşılaştırma yapıyor. Hızlı ve kirli

cevap

12

: Sonra yol dizesinden bir FileInfo nesne oluşturulur ve adres Geçmişte

FullName özelliği kullanılır. Bu, tüm .. \ 's ve. \' S kaldırır.

Tabii ki birlikte çalışma olabilir:

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

3 çözümler:

En iyi durum senaryosu, sen çağıran süreç dosya sistemi tam erişime sahip olacak% 100 kesin. Ikaz: Bir üretim kutuyu izni zaman özgür değiliz

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

yanıltıcı olabilir ama olabilir. Çoğunlukla dizisi aritmetiğini izinsiz yapmanız gerekir. Bunun için yerel bir çağrı var. Ikaz: yerli çağrı

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); 

Üçüncü strateji için tatil CLR kandırmaktır. Path.GetFullPath() sadece kurgusal bir yolda çalışıyor, bu yüzden her zaman bir tane verdiğinizden emin olun. Ne yapabilirsiniz sahte UNC yolu ile kök değiş tokuş etmek, GetFullPath() arayın ve sonra geri gerçeğini takas Ikaz:. bu kod incelemede bir sabit satmak isteyebilir

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; 
    }