विंडोज एप्लिकेशन में किसी रिश्तेदार पथ को निरपेक्ष पथ में कैसे परिवर्तित करें?


90

मैं एक विंडोज पथ के लिए एक रिश्तेदार पथ को एक निरपेक्ष पथ में कैसे परिवर्तित करूं?

मुझे पता है कि हम ASP.NET में server.MapPath () का उपयोग कर सकते हैं। लेकिन हम विंडोज एप्लिकेशन में क्या कर सकते हैं?

मेरा मतलब है, अगर कोई .NET बिल्ट-इन फ़ंक्शन है जो कि संभाल सकता है ...


2
क्या आप वर्तमान निर्देशिका के सापेक्ष पथ का अर्थ है, दूसरे शब्दों में, कार्यशील निर्देशिका, या .exe के स्थान के सापेक्ष?
— टोबियास हर्टकोर्न 9:09

2
दो तरह के सापेक्ष रास्ते होते हैं। यदि कोई फॉर्म "A \ B \ C" है और उसका कोई विशेष आधार नहीं है। दूसरे के पास "। \ A \ B" या ".. \ A \ B" रूप है; वे वर्तमान कार्यशील निर्देशिका के सापेक्ष हैं।
— MSalters

1
@ अमित ढल्ल: वैसे, इसका उत्तर स्वीकार करने और उसे बढ़ाने में अच्छी बात है जो आपकी मदद करते हैं।
— फ्रांसिस बी।

जवाबों:


183

आपने कोशिश की है:

string absolute = Path.GetFullPath(relative);

? ध्यान दें कि प्रक्रिया की वर्तमान कार्यशील निर्देशिका का उपयोग करेगा, निष्पादन योग्य युक्त निर्देशिका का नहीं। यदि वह मदद नहीं करता है, तो कृपया अपना प्रश्न स्पष्ट करें।


4
क्या यह इस बात पर निर्भर नहीं करेगा कि आप एप को कहां से शुरू करते हैं, न कि इस आधार पर कि एक्सई कहां स्थित है? दी गई सवाल वास्तव में उस पर स्पष्ट नहीं है।
— टोबियास हर्टकोर्न ने

1
जैसा कि आप कहते हैं, प्रश्न स्पष्ट नहीं है। GetFullPath वर्तमान कार्यशील निर्देशिका से हल करेगा। मैं यह इंगित करने के लिए अपनी प्रतिक्रिया संपादित करूंगा।
— जॉन स्कीट

1
यदि किसी एप्लिकेशन को विंडोज एक्सप्लोरर के माध्यम से शुरू किया जाता है, तो ऐसा लगता है कि वर्तमान निर्देशिका और निष्पादित विधानसभा निर्देशिका समान हैं (कम से कम जब तक कुछ उन्हें अलग करने के लिए नहीं किया जाता है)। यह सच है भले ही आप निष्पादन योग्य के लिए एक शॉर्ट-कट का उपयोग करते हैं जहां शॉर्ट-कट कहीं पूरी तरह से अलग रहता है।
— H2ONaCl

19

यदि आप अपने .exe के सापेक्ष पथ प्राप्त करना चाहते हैं तो उपयोग करें

string absolute = Path.Combine(Application.ExecutablePath, relative);

4
बस Path.Combine के साथ सावधान रहें। यदि relative रिलेटिव ’पार्ट स्लैश से शुरू होता है, तो यह वह नहीं कर सकता जो आप सोचते हैं कि यह होगा।
— दोपहर रेशम

2
@ सिल्की: ठीक है, तो यह सापेक्ष नहीं है, है ना?
— Tor Haugen

1
लगता है Path.Combineड्राइव-रिलेटिव पाथ को भी हैंडल नहीं कर सकता। यह सिर्फ प्रारंभिक पथ की अनदेखी करता है। मैं अपना पूरा समाधान पोस्ट कर रहा हूं।
— Nyerguds

3
यह एक सापेक्ष पथ को संभाल नहीं सकता है। यह केवल एक निर्देशिका और एक फ़ाइल नाम स्वीकार करता है। यदि दूसरा तर्क किसी भी चीज़ से शुरू होता है .., तो यह कचरा पैदा करेगा।
— जोनाथन वुड

1
@JonathanWood वास्तव में, कि "कचरा" ( ..उन में शामिल पथ ) पूरी तरह से स्वीकार किए जाते हैं और सभी फ़ाइल हेरफेर सिस्टमों द्वारा इननेट में हल किए जाते हैं। यदि यह आपको परेशान करता है, तो उस absolute = Path.GetFullPath(absolute)पर अमल करें।
— Nyerguds

15

यह एक अलग ड्राइव पर पथ के लिए काम करता है, ड्राइव-रिलेटिव पथ के लिए और वास्तविक सापेक्ष पथ के लिए। बिल्ली, यह भी काम करता है अगर basePathवास्तव में पूर्ण नहीं है; यह हमेशा अंतिम फॉलबैक के रूप में वर्तमान कार्यशील निर्देशिका का उपयोग करता है।

public static String GetAbsolutePath(String path)
{
    return GetAbsolutePath(null, path);
}

public static String GetAbsolutePath(String basePath, String path)
{
    if (path == null)
        return null;
    if (basePath == null)
        basePath = Path.GetFullPath("."); // quick way of getting current working directory
    else
        basePath = GetAbsolutePath(null, basePath); // to be REALLY sure ;)
    String finalPath;
    // specific for windows paths starting on \ - they need the drive added to them.
    // I constructed this piece like this for possible Mono support.
    if (!Path.IsPathRooted(path) || "\\".Equals(Path.GetPathRoot(path)))
    {
        if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
            finalPath = Path.Combine(Path.GetPathRoot(basePath), path.TrimStart(Path.DirectorySeparatorChar));
        else
            finalPath = Path.Combine(basePath, path);
    }
    else
        finalPath = path;
    // resolves any internal "..\" to get the true full path.
    return Path.GetFullPath(finalPath);
}

1
महान समाधान क्योंकि यह एक आधार पथ के अनुसार या तो निरपेक्ष या रिश्तेदारों पथ को जोड़ता है। मेरी राय में, सापेक्षपाठ ​​का नाम बदलकर AbsoluteOrRelativePath होना चाहिए, क्योंकि यह वही है जो वास्तव में प्रतिनिधित्व करता है। धन्यवाद
— जूलियो नोब्रे

1
खैर, अगर यह पहले से ही एक पूर्ण मार्ग है, तो यह सिर्फ एक विशेष मामला है, वास्तव में ... फ़ंक्शन अभी भी रिश्तेदार पथों को हल करने के लिए है, योग्य। मैंने इसे सिर्फ नाम दिया है कि यह स्पष्ट करने के लिए कि कौन सा पैरामीटर है;)
— Nyerguds

1
@JulioNobre विशेष रूप से जब से यहाँ args की तुलना में उलट कर रहे हैं Path.Combine। यह आसानी से तय हो गया है, लेकिन मैं इससे बचता हूं क्योंकि मैं इसका इस्तेमाल अक्सर काम करने वाली निर्देशिका पर सापेक्ष पथों को हल करने के लिए करता हूं, और अशक्त होने के कारण यह अजीब लगता है।
— Nyerguds

1
मैं आपकी सलाह की सराहना करता हूं, लेकिन मैं केवल इस सहायक का उपयोग करने का इरादा रखता हूं जब मुझे एक आधार पथ को दूसरे पथ के साथ संयोजित करने की आवश्यकता होती है जो या तो उस आधार पथ के सापेक्ष हो सकती है या निरपेक्ष हो सकती है। इसलिए मैंने निम्नलिखित हस्ताक्षर अपनाने को प्राथमिकता दी है: GetAbsolutePath (स्ट्रिंग बेसपाथ, स्ट्रिंग RelativeOrAbsolutePath)। यदि कुछ तर्क शून्य है, तो इस पद्धति का उपयोग करने के लिए दोनों को अनिवार्य करने के लिए एक अपवाद उठाया जाता है। फिर से, धन्यवाद :-)
— जूलियो नोब्रे

2
हाँ, यह समझदार है। हालांकि यह चारों ओर कुछ args हथकंडा करने के लिए इसे संपादित करने के लिए परेशान नहीं किया जा सकता है।
— Nyerguds

1

यह थोड़ा पुराना विषय है, लेकिन यह किसी के लिए उपयोगी हो सकता है। मैंने इसी तरह की समस्या को हल किया है, लेकिन मेरे मामले में, पथ पाठ की शुरुआत में नहीं था।

तो यहाँ मेरा समाधान है:

public static class StringExtension
{
    private const string parentSymbol = "..\\";
    private const string absoluteSymbol = ".\\";
    public static String AbsolutePath(this string relativePath)
    {
        string replacePath = AppDomain.CurrentDomain.BaseDirectory;
        int parentStart = relativePath.IndexOf(parentSymbol);
        int absoluteStart = relativePath.IndexOf(absoluteSymbol);
        if (parentStart >= 0)
        {
            int parentLength = 0;
            while (relativePath.Substring(parentStart + parentLength).Contains(parentSymbol))
            {
                replacePath = new DirectoryInfo(replacePath).Parent.FullName;
                parentLength = parentLength + parentSymbol.Length;
            };
            relativePath = relativePath.Replace(relativePath.Substring(parentStart, parentLength), string.Format("{0}\\", replacePath));
        }
        else if (absoluteStart >= 0)
        {
            relativePath = relativePath.Replace(".\\", replacePath);
        }
        return relativePath;
    }
}

उदाहरण:

Data Source=.\Data\Data.sdf;Persist Security Info=False;
Data Source=..\..\bin\Debug\Data\Data.sdf;Persist Security Info=False;

1
उम। आप पहिया को फिर से मजबूत कर रहे हैं। Path.GetFullPathस्वतः हल हो जाता है। इसके अलावा, आप AbsolutePathस्ट्रिंग में सामान्य रूप से एक्सटेंशन फ़ंक्शन जोड़ रहे हैं ... थोड़ा ओवरकिल हो सकता है।
— Nyerguds

1
क्या मैं गलत कह रहा हूं कि Path.GetFullPath हमेशा आधार निर्देशिका को एप्लिकेशन की वर्तमान निर्देशिका के रूप में मानता है। इस स्थिति में, Path.GetFullPath किसी भिन्न निर्देशिका से पूर्ण पथ को वापस करने में सक्षम नहीं है। निम्नलिखित एल्गोरिथ्म, हालांकि, इसे ध्यान में रखता है ... मेरा मतलब है, आपको बस एक और वैकल्पिक पैरामीटर जोड़ना होगा जो कि CurrentDomainDirectory की जगह होगी।
— शमूएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.