Path.Compine আপেক্ষিক পাথ স্ট্রিং সহ পরম


96

আমি একটি উইন্ডোজ পাথের সাথে একটি আপেক্ষিক পথ ব্যবহার করে যোগ দেওয়ার চেষ্টা করছি Path.Combine

তবে এর পরিবর্তে Path.Combine(@"C:\blah",@"..\bling")রিটার্ন C:\blah\..\blingদেয় C:\bling\

আমার নিজের আপেক্ষিক পথের সমাধানের সমাধান না করে কেউ কীভাবে এটি সম্পাদন করতে জানে (যা খুব বেশি শক্ত হওয়া উচিত নয়)?



4
আমরা এখানে বিভিন্ন উত্তর পাচ্ছি .. আমার মনে হয় না এটি একটি সদৃশ
সিভেরটেক্স

4
এটি সদৃশ, যদিও আমি মনে করি পাথ.গেটফুলনাম এটি একটি আরও ভাল সমাধান।
গ্রেগ ডিন

আপনি কেবল নিজের সাথে বিরোধিতা করেছেন। তবে বিকল্প উত্তরের জন্য ধন্যবাদ।
সিভেরটেক্স

উত্তর:


64

কি কাজ:

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

(ফলাফল: পরমপথ = "সি: ling bling.txt")

কি কাজ করে না

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

(ফলাফল: পরমপথ = "সি: / ব্লাহ / ব্লিং.টেক্সট")


8
হ্যাঁ, আমি এই পোস্টটি
দিয়েই অন্তর্নিহিত

7
কেবলমাত্র নিশ্চিত করুন যে বেসডাইরেক্টরির পিছনে রয়েছে \\, অন্যথায় আপনি শেষ করেন C:\\blah..\\bling.txtএবং এটি কার্যকর হয় না। সেক্ষেত্রে আপনি ম্যানুয়ালি এগুলি স্ট্রিংয়ে যোগ করতে পারেন বা করতে পারেনPath.GetFullPath(Path.Combine(baseDirectory, relativePath))
নেলসন রডর্মেল

4
আপনার কি কাজ বিভাগের ফলাফল হওয়া উচিত নয় C:\bling.txt?
cod3monk3y

ইউআরআই ভিত্তিক পদ্ধতিটি কেন কাজ করে না? এই উত্তর অনুসারে , ফলাফলটি বৈধ (এবং এটি উইন্ডোতেও স্বীকৃত বলে মনে হচ্ছে )।
এফএইচ

38

সম্মিলিত পথে http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx- এ পাথ.গেটফুলপাথকে কল করুন

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

(আমি পাথকে সম্মত করি omb কোম্বাইনকে নিজে থেকে এটি করা উচিত)


মনে রাখবেন যে এটি কেবল তখনই কাজ করে যদি প্রথম পথটি পরম পাথ হয়। এটি কাজ করে নাPath.GetFullPath(Path.Combine(@"..\..\blah",@"\bling"))
ডেরেকান্ট্রিকান


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;

4
পাথ.গেটফুলপাথ () এবং ডিরেক্টরীইনফো.ফুলনাম উভয়ই একটি কল্পিত পথে কাজ করবে। সমস্যাটি যখন ফাইলটি আসলে উপস্থিত থাকে তখন এক্সিকিউটিভ প্রক্রিয়াটির জন্য ফাইলআইওপারমিশন প্রয়োজন - উভয় এপিআই-র ক্ষেত্রেই সত্য। (এমএসডিএন দেখুন)
পল উইলিয়ামস 19

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একটি ছোট workaround সঙ্গে সংশোধন করতে উপর নির্ভর করে ।

এটি একটি এক্সটেনশন পদ্ধতি তাই এটির মতো ব্যবহার করুন 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));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.