2009-03-08 3 views
8

सी # में PathCanonicalize के बराबर क्या है?PathCanonicalize बराबर

उपयोग: मैं एक अच्छा अनुमान लेने के लिए दो फ़ाइल पथ (डिस्क उपयोग के बिना) एक ही फाइल को देखें कि क्या जरूरत है। मेरा सामान्य दृष्टिकोण इसे कुछ फिल्टर के माध्यम से फेंक रहा है जैसे मेकएब्सोल्यूट और पाथकैनोनिकललाइज, और फिर केस-असंवेदनशील तुलना करें।

उत्तर

12

त्वरित और गंदी:

अतीत मैं पथ स्ट्रिंग से एक FileInfo वस्तु बनाया और उसके बाद की है में FullName गुण का इस्तेमाल किया। यह सभी .. और \ 's को हटा देता है।

बेशक आप Interop सकता है:

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

3 समाधान:

बेस्ट स्थिति है, जहां आप 100% निश्चित बुला प्रक्रिया फाइल सिस्टम के लिए पूरा उपयोग करना होगा रहे हैं। चेतावनी: एक उत्पादन बॉक्स पर अनुमति मुश्किल

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

हो सकता है लेकिन, हम हमेशा मुक्त नहीं कर रहे हैं। अक्सर आपको अनुमति के बिना स्ट्रिंग अंकगणित करने की आवश्यकता होती है। इसके लिए एक मूल कॉल है। चेतावनी: देशी कॉल

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

एक तीसरा रणनीति के लिए रिसॉर्ट्स CLR चाल करने के लिए है। पथ। गेटफुलपाथ() एक कल्पित पथ पर बस ठीक काम करता है, इसलिए बस सुनिश्चित करें कि आप इसे हमेशा एक दे रहे हैं। आप क्या कर सकते जाली यूएनसी पथ के साथ रूट बाहर स्वैप करने के लिए है, GetFullPath() कहते हैं, और फिर असली एक वापस स्वैप में चेतावनी:। इस कोड की समीक्षा में एक कठिन बेचने की आवश्यकता हो सकती

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