2009-11-19 15 views
24

में एक पथ से दूसरे रास्ते में एक सापेक्ष पथ कैसे प्राप्त करूं, मुझे आशा है कि ऐसा करने के लिए .NET विधि में बनाया गया है, लेकिन मुझे यह नहीं मिल रहा है।मैं सी #

मेरे पास दो पथ हैं जो मुझे एक ही रूट ड्राइव पर जाना है, मैं एक से दूसरे में एक सापेक्ष पथ प्राप्त करने में सक्षम होना चाहता हूं।

string path1 = @"c:\dir1\dir2\"; 
string path2 = @"c:\dir1\dir3\file1.txt"; 
string relPath = MysteryFunctionThatShouldExist(path1, path2); 
// relPath == "..\dir3\file1.txt" 

क्या यह कार्य मौजूद है? यदि नहीं, तो इसे लागू करने का सबसे अच्छा तरीका क्या होगा?

उत्तर

47

Uri काम करता है:

Uri path1 = new Uri(@"c:\dir1\dir2\"); 
Uri path2 = new Uri(@"c:\dir1\dir3\file1.txt"); 
Uri diff = path1.MakeRelativeUri(path2); 
string relPath = diff.OriginalString; 
+1

उरी काम करता है लेकिन स्लैश अग्रेषित करने के लिए है, जो काफी आसान तय करने के लिए है स्विच करेंगे। धन्यवाद! –

9

तुम भी PathRelativePathTo समारोह आयात और यह कह सकते हैं।

उदा .:

using System.Runtime.InteropServices; 

public static class Util 
{ 
    [DllImport("shlwapi.dll", EntryPoint = "PathRelativePathTo")] 
    protected static extern bool PathRelativePathTo(StringBuilder lpszDst, 
     string from, UInt32 attrFrom, 
     string to, UInt32 attrTo); 

    public static string GetRelativePath(string from, string to) 
    { 
    StringBuilder builder = new StringBuilder(1024); 
    bool result = PathRelativePathTo(builder, from, 0, to, 0); 
    return builder.ToString(); 
    } 
} 
+0

मेरे लिए काम करता है, लेकिन मुझे "संरक्षित" को हटा देना था, अन्यथा (VS2012, .NET3.5 के साथ) मुझे त्रुटि CS1057 मिलती है: "PathRelativePathTo (System.Text.StringBuilder, string, uint, string, uint) ': स्थैतिक वर्गों में संरक्षित सदस्यों को शामिल नहीं किया जा सकता है " –

+0

एक साधारण मामले के लिए Win32 एपीआई आयात करना ऐसा लगता है कि यह अधिक हो रहा है, हालांकि यह जानना अच्छा है कि यह संभव है। – FacelessPanda

+0

@ फ़ैलेसलेस पांडा यह शायद ही कभी अधिक हो रहा है - पुस्तकालय लगभग निश्चित रूप से लोड हो गया है, इसलिए इसका उपयोग शून्य ओवरहेड है। –