2009-06-09 5 views
15

से डॉट्स निकालें मैं "c: \ foo \ .. \ bar" को "c: \ bar" में कैसे परिवर्तित कर सकता हूं?नेट - पथ

उत्तर

2

मैं क्या आप Syetem.IO.Path है, क्योंकि यह सामान्य रास्तों, यहां तक ​​कि इंटरनेट रास्तों के बारे में कई मुद्दों से निपटने के लिए तरीके प्रदान के लिए देख रहे विश्वास करते हैं।

0

कोई सीधा जवाब नहीं है, लेकिन सवाल से मुझे संदेह है कि आप System.IO.Path.Combine() विधि को फिर से शुरू करने की कोशिश कर रहे हैं। उस पथ को बनाने की ज़रूरत को खत्म करना चाहिए जिसे आप समग्र रूप से पूछ रहे हैं।

+2

पथ। कॉम्बाइन ".." को हल नहीं करता है, तो यह केवल एक पथ विभाजक (प्लेटफ़ॉर्म के आधार पर) का उपयोग करके दो पथों को जोड़ता है। –

2

कोशिश System.IO.Path.GetFullPath (@ "c: \ foo .. \ बार")

5

आप System.IO.Path वर्ग का उपयोग कर

string path = Path.GetFullPath(@"C:\foo\..\bar"); 

सी # में की कोशिश की?

var normalizePathRegex = new Regex(@"\[^\]+\.."); 
var path = @"C:\lorem\..\ipsum" 
var result = normalizePathRegex.Replace(unnormalizedPath, x => string.Empty); 

यूआरएल और Unix- शैली के रास्तों:

var normalizePathRegex = new Regex(@"/[^/]+/.."); 
var path = @"/lorem/../ipsum" 
var result = normalizePathRegex.Replace(unnormalizedPath, x => string.Empty); 

नोट:

0

मामले में आप इस खुद करना चाहते हैं, तो आप इस कोड का उपयोग कर सकते करने के लिए याद रखें वास्तविक कोड एप्लिकेशन में इस कोड का उपयोग करते समय RegexOptions.Compiled का उपयोग करें

1

मैं उन्हें निरपेक्ष पथ में परिवर्तित करने के बिना रिश्तेदार पथ की रक्षा करने के लिए चाहता था, भी मैं दोनों का समर्थन करना चाहता था - विंडोज और लिनक्स शैली linefeeds (\ या /) - तो मैं निम्न सूत्र & परीक्षण आवेदन के साथ आया है:

using System; 
using System.Diagnostics; 
using System.Text.RegularExpressions; 

class Script 
{ 
    /// <summary> 
    /// Simplifies path, by removed upper folder references "folder\.." will be converted 
    /// </summary> 
    /// <param name="path">Path to simplify</param> 
    /// <returns>Related path</returns> 
    static String PathSimplify(String path) 
    { 
     while (true) 
     { 
      String newPath = new Regex(@"[^\\/]+(?<!\.\.)[\\/]\.\.[\\/]").Replace(path, ""); 
      if (newPath == path) break; 
      path = newPath; 
     } 
     return path; 
    } 


    [STAThread] 
    static public void Main(string[] args) 
    { 
     Debug.Assert(PathSimplify("x/x/../../xx/bbb") == "xx/bbb"); 
     // Not a valid path reference, don't do anything. 
     Debug.Assert(PathSimplify(@"C:\X\\..\y") == @"C:\X\\..\y"); 
     Debug.Assert(PathSimplify(@"C:\X\..\yy") == @"C:\yy"); 
     Debug.Assert(PathSimplify(@"C:\X\..\y") == @"C:\y"); 
     Debug.Assert(PathSimplify(@"c:\somefolder\") == @"c:\somefolder\"); 
     Debug.Assert(PathSimplify(@"c:\somefolder\..\otherfolder") == @"c:\otherfolder"); 
     Debug.Assert(PathSimplify("aaa/bbb") == "aaa/bbb"); 
    } 
} 

अतिरिक्त ऊपरी फ़ोल्डर संदर्भ हटाएं यदि कोई

+0

अंगूठे के नियम के रूप में: आपके द्वारा पेश किए जाने वाले प्रत्येक रेगेक्स के साथ, आप एक और समस्या पेश करते हैं। यह नियम यहां लागू होता है: 'सी: \ एक्स \\ .. \ y -> .. \ y',' C: \ X \ Y \ Z \\\ .. \ y -> सी: \ X \\ .. \ y'। –

+0

आह, मेरी गलती। '।' किसी भी चरित्र के लिए मेल खाता है, जबकि मेरा मतलब वास्तव में डॉट है। तो डॉट से बच जाना चाहिए। उपरोक्त उत्तर में फिक्स्ड। लेकिन आपके केस पथ में बदलाव नहीं होंगे, क्योंकि डॉट्स से पहले डबल स्लैश होता है। "\\ .."। मेरे परिप्रेक्ष्य से यह वैध पथ नहीं है और इसे बनाए रखने के लिए बेहतर है। – TarmoPikaro

+0

लेकिन मेरे उदाहरण दर्शाते हैं कि पथ _are_ बदल गए हैं। और डबल बैकस्लाश, जहां तक ​​मुझे पता है, परिभाषा द्वारा मान्य है। –