উইন্ডোজ অ্যাপ্লিকেশনটিতে কীভাবে কোনও আপেক্ষিক পাথকে পরম পথে রূপান্তর করতে হয়?


90

উইন্ডোজ অ্যাপ্লিকেশনটিতে আমি কীভাবে কোনও আপেক্ষিক পাথকে একটি পরম পথে রূপান্তর করতে পারি?

আমি জানি আমরা এএসপি.নেটে সার্ভার.ম্যাপপথ () ব্যবহার করতে পারি। তবে উইন্ডোজ অ্যাপ্লিকেশনটিতে আমরা কী করতে পারি?

মানে, যদি কোনও .NET অন্তর্নির্মিত ফাংশন থাকে যা এটি পরিচালনা করতে পারে ...


4
আপনি কি বর্তমান ডিরেক্টরিতে কোনও আপেক্ষিক পাথ বোঝাতে চান, অন্য কথায় ওয়ার্কিং ডিরেক্টরি, বা .exe এর অবস্থানের সাথে আপেক্ষিক?
— টোবিয়াস হার্টকর্ন

4
দুটি ধরণের আপেক্ষিক পথ রয়েছে। "A \ B \ C" ফর্মটির একটি এবং একটি নির্দিষ্ট বেস বোঝায় না। অন্যটির ফর্ম রয়েছে "। \ এ \ বি" বা ".. \ এ \ বি"; সেগুলি বর্তমান ওয়ার্কিং ডিরেক্টরি সম্পর্কিত to
— এমসাল্টারস

4
@ আমিত llাল: যাইহোক, উত্তরটি (গুলি) আপনাকে সহায়তা করবে তা গ্রহণ এবং গ্রহণ করতে ভাল জিনিস।
— ফ্রান্সিস বি।

উত্তর:


183

আপনি চেষ্টা করেছেন:

string absolute = Path.GetFullPath(relative);

? মনে রাখবেন যে এটি প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরি ব্যবহার করবে, এক্সিকিউটেবল যুক্ত ডিরেক্টরি নয়। যদি এটি সাহায্য না করে, দয়া করে আপনার প্রশ্নটি পরিষ্কার করুন।


4
আপনি কী অ্যাপ্লিকেশনটি শুরু করেছেন তার উপর নির্ভর করে না, উদাহরণটি কোথায় থাকবে? মঞ্জুর করা প্রশ্নটি আসলে তাতে পরিষ্কার নয়।
— টোবিয়াস হার্টকর্ন

4
যেমনটি আপনি বলেছেন, প্রশ্নটি পরিষ্কার নয়। গেটফুলপথটি বর্তমান কার্যকারী ডিরেক্টরি থেকে সমাধান করবে। আমি এটিকে ইঙ্গিত করতে আমার প্রতিক্রিয়া সম্পাদনা করব।
— জন স্কিটি

4
যদি উইন্ডোজ এক্সপ্লোরারের মাধ্যমে কোনও অ্যাপ্লিকেশন শুরু করা হয় তবে মনে হয় যে বর্তমান ডিরেক্টরি এবং এক্সিকিউটিভ অ্যাসেমব্লিলি ডিরেক্টরিটি একই (কমপক্ষে এগুলিকে আলাদা করার জন্য কিছু না করা পর্যন্ত)। আপনি যদি এক্সিকিউটেবলের জন্য শর্ট-কাট ব্যবহার করেন তবে শর্ট-কাট অন্য কোথাও সম্পূর্ণ আলাদা থাকে This
— H2ONaCl

19

আপনি যদি আপনার .exe এর তুলনায় পাথ পেতে চান তবে ব্যবহার করুন

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

4
পাথ.কোমাইন সাথে কেবল সতর্কতা অবলম্বন করুন। যদি 'আত্মীয়' অংশটি স্ল্যাশ দিয়ে শুরু হয় তবে এটি আপনি যা ভাবেন তা করতে পারে না।
— দুপুর সিল্ক

4
@ সিলকি: আচ্ছা, তাহলে এটি আপেক্ষিক নয়, তাই না?
— টর হগেন

4
Path.Combineএমনকি ড্রাইভ-আপেক্ষিক পাথ পরিচালনা করতে পারে না বলে মনে হচ্ছে । এটি মনে হয় কেবল প্রাথমিক পথটিকে উপেক্ষা করে। আমি আমার নিজস্ব সমাধান পোস্ট করছি।
— নায়ারগডস

4
এটি কোনও আপেক্ষিক পথ পরিচালনা করতে পারে না। এটি কেবল একটি ডিরেক্টরি এবং একটি ফাইল নাম গ্রহণ করে। দ্বিতীয় যুক্তি যদি এর মতো কিছু দিয়ে শুরু হয় তবে ..এটি আবর্জনা তৈরি করবে।
— জোনাথন উড

4
@ জোনাথনউইড প্রকৃতপক্ষে, "আবর্জনা" (সেগুলিতে অন্তর্ভুক্ত পাথগুলি ..)। নেট এ সমস্ত ফাইল ম্যানিপুলেশন সিস্টেম দ্বারা নিখুঁতভাবে গ্রহণ এবং সমাধান করা হয়েছে। যদি এটি আপনাকে বিরক্ত করে, তবে এটি কার্যকর absolute = Path.GetFullPath(absolute)করুন।
— নাইয়ারগডস

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

4
দুর্দান্ত সমাধান কারণ এটি একটি বেস পাথ অনুযায়ী নিখুঁত বা আত্মীয়দের পাথকে একত্রিত করে। আমার মতে, আপেক্ষিকপথ যুক্তির নাম পরিবর্তন করে AbsolveOrRelativePath করা উচিত, যেহেতু এটি সত্যই প্রতিনিধিত্ব করে। ধন্যবাদ
— জুলিও নোবর

4
ঠিক আছে, যদি এটি ইতিমধ্যে একটি পরম পথ, এটি কেবল একটি বিশেষ কেস, সত্যিই ... ফাংশনটি এখনও আপেক্ষিক পথগুলি সমাধান করার জন্যই হয়, হ'ল। আমি কেবল এটির নামকরণ করেছি যে এটি পরিষ্কার করার জন্য কোন প্যারামিটারটি;))
— নাইয়ারগডস

4
@ জুলিওনব্রে বিশেষত যেহেতু এখানের আর্কগুলি তুলনা করে বিপরীত হয়েছে Path.Combine। এটি সহজেই স্থির হয়ে গেছে তবে আমি এড়াতে পারি যেহেতু আমি প্রায়শই এটি ভার্চিং ডিরেক্টরিতে আপেক্ষিক পাথগুলি সমাধান করার জন্য ব্যবহার করি এবং প্রথম যুক্তি হিসাবে নাল দেওয়া অদ্ভুত বলে মনে হয়।
— নাইয়ারগডস

4
আমি আপনার পরামর্শের প্রশংসা করি, তবে আমি কেবল তখনই এই সহায়কটিকে ব্যবহার করার ইচ্ছা করি যখন আমার কোনও বেস পাথের সাথে অন্য পথের সাথে সংযুক্ত করতে হয় যা সেই বেস পাথের সাথে বা পরম হতে পারে। সে কারণেই আমি নিম্নলিখিত স্বাক্ষরগুলি গ্রহণ করতে পছন্দ করেছি: গেটএবসুলিউটপাথ (স্ট্রিং বেসপ্যাথ, স্ট্রিং রিলেটিভঅর অ্যাসবসুটপথ)। কিছু যুক্তি যদি নাল হয় তবে শক্তিশালীকরণের জন্য একটি ব্যতিক্রম উত্থাপন করা হয় যে এই পদ্ধতিটি ব্যবহার করা উভয়ই বাধ্যতামূলক। আবার, ধন্যবাদ :-)
— জুলিও নোব্রে

4
হ্যাঁ, এটি বুদ্ধিমান। যদিও এটিকে সম্পাদনা করার জন্য বিরক্ত করা যাবে না তবে কিছু আর্গুমেন্টকে ঘিরে to
— নাইয়ারগডস

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;

4
উম। আপনি চাকা পুনরুদ্ধার করছেন। Path.GetFullPathসমাধান করে \ এবং .. \ স্বয়ংক্রিয়ভাবে। এছাড়াও, আপনি AbsolutePathসাধারণভাবে স্ট্রিং ক্লাসে এক্সটেনশন ফাংশন যুক্ত করছেন ... কিছুটা ওভারকিল হতে পারে।
— নাইয়ারগডস

4
আমি কি ভুল করে বলছি যে পাথ.গেটফুলপ্যাথ সবসময় বেস ডিরেক্টরিটিকে অ্যাপ্লিকেশনটির অ্যাপডোমেনের বর্তমান ডিরেক্টরি হিসাবে বিবেচনা করে। এই ক্ষেত্রে, পাথ.গেটফুলপথ কোনও পৃথক ডিরেক্টরি থেকে সম্পূর্ণ পাথ ফেরত দিতে সক্ষম নয়। নিম্নলিখিত অ্যালগরিদম যাইহোক, এটি বিবেচনায় নিয়েছে ... মানে, আপনাকে কেবলমাত্র অন্য একটি alচ্ছিক প্যারামিটার যুক্ত করতে হবে যা কারেন্টডোমাইনডাইরেক্টরির একটি প্রতিস্থাপন হবে।
— স্যামুয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.