Path.Combine सापेक्ष पथ तार के साथ निरपेक्ष


94

मैं एक रिश्तेदार पथ का उपयोग करके विंडोज पथ से जुड़ने की कोशिश कर रहा हूं Path.Combine

हालांकि, Path.Combine(@"C:\blah",@"..\bling")रिटर्न C:\blah\..\blingके बजाय C:\bling\

क्या किसी को पता है कि अपने रिश्तेदार पथ रिज़ॉल्वर (जो बहुत कठिन नहीं होना चाहिए) को लिखे बिना इसे पूरा करना है?



5
हम .. मुझे नहीं लगता कि यह डुप्लिकेट है, अलग अलग जवाब हो रही है यहाँ
CVertex

1
यह डुप्लिकेट है, हालांकि मुझे लगता है कि Path.GetFullName एक बेहतर समाधान है।
ग्रेग डीन

आपने सिर्फ अपने आप को प्रतिवाद किया। लेकिन वैकल्पिक उत्तर के लिए धन्यवाद।
CVertex

जवाबों:


63

क्या काम करता है:

string relativePath = "..\\bling.txt";
string baseDirectory = "C:\\blah\\";
string absolutePath = Path.GetFullPath(baseDirectory + relativePath);

(परिणाम: निरपेक्ष = "C: \ bling.txt")

क्या काम नहीं करता

string relativePath = "..\\bling.txt";
Uri baseAbsoluteUri = new Uri("C:\\blah\\");
string absolutePath = new Uri(baseAbsoluteUri, relativePath).AbsolutePath;

(परिणाम: निरपेक्ष = "C: /blah/bling.txt")


8
हां, यही कि मैं इस पोस्ट के साथ
इंसुलेट कर

7
बस सुनिश्चित करें कि बेसडायरेक्ट्री में ट्रेलिंग \\ है, अन्यथा आप साथ C:\\blah..\\bling.txtकाम करते हैं और यह काम नहीं करता है। उस स्थिति में आप मैन्युअल रूप से उन्हें स्ट्रिंग में जोड़ सकते हैं या कर सकते हैंPath.GetFullPath(Path.Combine(baseDirectory, relativePath))
नेल्सन रॉथमेल

5
आपके व्हाट्स वर्क्स सेक्शन का परिणाम नहीं होना चाहिए C:\bling.txt?
cod3monk3y

यूआरआई-आधारित पद्धति काम क्यों नहीं करती है? इस उत्तर के अनुसार , परिणाम मान्य है (और यह विंडोज पर भी पहचाना जाने लगता है )।
एफएच

37

Path.GetFullPath को संयुक्त पथ http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx पर कॉल करें

> Path.GetFullPath(Path.Combine(@"C:\blah\",@"..\bling"))
C:\bling

(मैं पथ से सहमत हूँ। कोम्बाइन को स्वयं ऐसा करना चाहिए)


ध्यान दें कि यह केवल तभी काम करता है जब पहला पथ एक पूर्ण पथ हो। यह के लिए काम नहीं करता हैPath.GetFullPath(Path.Combine(@"..\..\blah",@"\bling"))
derekantrican


4

विंडोज़ के लिए सार्वभौमिक ऐप्स Path.GetFullPath()उपलब्ध नहीं हैं, आप System.Uriइसके बजाय कक्षा का उपयोग कर सकते हैं :

 Uri uri = new Uri(Path.Combine(@"C:\blah\",@"..\bling"));
 Console.WriteLine(uri.LocalPath);

3

यह आपको वही देगा जो आपको चाहिए (काम करने के लिए रास्ता मौजूद नहीं है)

DirectoryInfo di = new DirectoryInfo(@"C:\blah\..\bling");
string cleanPath = di.FullName;

1
Path.GetFullPath () और DirectoryInfo.FullName दोनों एक काल्पनिक रास्ते पर काम करेंगे। समस्या तब है जब फ़ाइल वास्तव में मौजूद है, निष्पादन प्रक्रिया को दोनों एपीआई के लिए FileIOPermission - true की आवश्यकता है। (देखें MSDN)
पॉल विलियम्स

1

बैकस्लैश के साथ सावधान रहें, उन्हें मत भूलना (न ही दो बार उपयोग करें :)

string relativePath = "..\\bling.txt";
string baseDirectory = "C:\\blah\\";
//OR:
//string relativePath = "\\..\\bling.txt";
//string baseDirectory = "C:\\blah";
//THEN
string absolutePath = Path.GetFullPath(baseDirectory + relativePath);

0

Path.GetFullPath() रिश्तेदार रास्तों के साथ काम नहीं करता है।

यहाँ समाधान है कि दोनों रिश्तेदार + निरपेक्ष पथ के साथ काम करता है। यह लिनक्स + विंडोज दोनों पर काम करता है और यह ..पाठ की शुरुआत में उम्मीद के मुताबिक रहता है (बाकी वे सामान्यीकृत होंगे)। समाधान अभी भी Path.GetFullPathएक छोटे से समाधान के साथ तय करने के लिए पर निर्भर करता है ।

यह एक विस्तार विधि है इसलिए इसका उपयोग करें text.Canonicalize()

/// <summary>
///     Fixes "../.." etc
/// </summary>
public static string Canonicalize(this string path)
{
    if (path.IsAbsolutePath())
        return Path.GetFullPath(path);
    var fakeRoot = Environment.CurrentDirectory; // Gives us a cross platform full path
    var combined = Path.Combine(fakeRoot, path);
    combined = Path.GetFullPath(combined);
    return combined.RelativeTo(fakeRoot);
}
private static bool IsAbsolutePath(this string path)
{
    if (path == null) throw new ArgumentNullException(nameof(path));
    return
        Path.IsPathRooted(path)
        && !Path.GetPathRoot(path).Equals(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)
        && !Path.GetPathRoot(path).Equals(Path.AltDirectorySeparatorChar.ToString(), StringComparison.Ordinal);
}
private static string RelativeTo(this string filespec, string folder)
{
    var pathUri = new Uri(filespec);
    // Folders must end in a slash
    if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString())) folder += Path.DirectorySeparatorChar;
    var folderUri = new Uri(folder);
    return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString()
        .Replace('/', Path.DirectorySeparatorChar));
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.