পুরো পথ দেওয়া হয়েছে কিনা তা পরীক্ষা করে দেখুন


104

প্রদত্ত পথটি পুরো পথ কিনা তা পরীক্ষা করার কোনও পদ্ধতি আছে? এখনই আমি এটি করছি:

if (template.Contains(":\\")) //full path already given
{
}
else //calculate the path from local assembly
{
}

তবে এটি যাচাই করার জন্য আরও মার্জিত উপায় থাকতে হবে?

উত্তর:


141

ব্যবহার করার চেষ্টা করবেন System.IO.Path.IsPathRooted? এটি trueপরম পথে ফিরে আসে returns

System.IO.Path.IsPathRooted(@"c:\foo"); // true
System.IO.Path.IsPathRooted(@"\foo"); // true
System.IO.Path.IsPathRooted("foo"); // false

System.IO.Path.IsPathRooted(@"c:1\foo"); // surprisingly also true
System.IO.Path.GetFullPath(@"c:1\foo");// returns "[current working directory]\1\foo"

14
দ্বিতীয় উদাহরণটি কীভাবে পরম পথ হতে পারে?
om471987

4
দ্বিতীয় পথটি নিখুঁত নয়, তবে এটি মূল। শীর্ষস্থানীয় স্ল্যাশ সিস্টেমের মূল নির্দেশ করে।
detaylor

3
@ স্মারকিন ঘেরকিন তাই মূল ও পরম পথের মধ্যে পার্থক্য কী?
জেসন অ্যাকসেলসন

1
আমার উত্তরটি দেখুন ( স্ট্যাকওভারফ্লো.com/ a/ 35046453 / 704808 ) এর সুবিধাগুলি ধরে রেখে পুরো পথ নিশ্চিত করে এমন বিকল্পের জন্য IsPathRooted: ফাইল সিস্টেমে অ্যাক্সেস এড়ানো বা অবৈধ ইনপুটটির জন্য ব্যতিক্রম ছোঁড়া।
weir

1
@ ড্যানিয়েল, আইআইআরসি এটি দেখানোর জন্য এটি অন্তর্ভুক্ত করা হয়েছিল যে পথটি ব্যবহারের জন্য কোনও বৈধ পথ হওয়ার দরকার নেই IsPathRooted, এটি অবশ্যই তেমন উল্লেখযোগ্য কিছু ছিল না। GetFullPathলাইন, যাতে অন্তর্ভুক্ত করা হয় সেই পথ মূল্যায়ন হচ্ছে পরিলক্ষিত হতে পারে
detaylor

30
Path.IsPathRooted(path)
&& !Path.GetPathRoot(path).Equals(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)

উপরের শর্ত:

  • ফাইল সিস্টেম অনুমতি প্রয়োজন হয় না
  • falseবেশিরভাগ ক্ষেত্রে ফিরে আসে যেখানে ফর্ম্যাটটি pathঅবৈধ (ব্যতিক্রম ছোঁড়ার পরিবর্তে)
  • ভলিউম অন্তর্ভুক্ত trueথাকলে কেবল ফেরত দেয়path

ওপির যেমন মতামত উত্থাপন করা হয়েছে, তারপরে এটি পূর্ববর্তী উত্তরের শর্তগুলির চেয়ে বেশি উপযুক্ত হতে পারে। উপরের শর্তটি থেকে ভিন্ন:

  • path == System.IO.Path.GetFullPath(path)falseএই পরিস্থিতিতে ফিরে আসার চেয়ে ব্যতিক্রম ছোঁড়ে :
    • কলারের কাছে প্রয়োজনীয় অনুমতি নেই
    • সিস্টেমটি পরম পাথ পুনরুদ্ধার করতে পারেনি
    • পাথটিতে একটি কোলন (":") রয়েছে যা ভলিউম শনাক্তকারীর অংশ নয়
    • নির্দিষ্ট পাথ, ফাইলের নাম বা উভয়ই সিস্টেম-সংজ্ঞায়িত সর্বাধিক দৈর্ঘ্যের চেয়ে বেশি
  • System.IO.Path.IsPathRooted(path)একক ডিরেক্টরি বিভাজক দিয়ে শুরু trueহলে ফিরে আসে returnspath

অবশেষে, এখানে একটি পদ্ধতি যা উপরের শর্তটি আবৃত করে এবং অবশিষ্ট সম্ভাব্য ব্যতিক্রমগুলি পূর্বাভাস দেয়:

public static bool IsFullPath(string path) {
    return !String.IsNullOrWhiteSpace(path)
        && path.IndexOfAny(System.IO.Path.GetInvalidPathChars().ToArray()) == -1
        && Path.IsPathRooted(path)
        && !Path.GetPathRoot(path).Equals(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal);
}

সম্পাদনা: EM0 এর মত এবং পাথের কৌতূহলের ক্ষেত্রে সম্বোধন করে একটি ভাল মন্তব্য এবং বিকল্প উত্তর দিয়েছে । সাহায্যের সিদ্ধান্ত নেন কীভাবে আপনি এই ধরনের পাথ হ্যান্ডেল করতে পারেন, আপনি দুটিই MSDN গভীর ডুব নিতে চান পারে -> উইন্ডোজ ডেস্কটপ অ্যাপ্লিকেশন -> বিকাশ -> ডেস্কটপ প্রযুক্তি -> ডেটা অ্যাক্সেস এবং সঞ্চয় -> স্থানীয় ফাইল সিস্টেম - -> ফাইল ম্যানেজমেন্ট -> ফাইল পরিচালনা সম্পর্কে -> ফাইলগুলি তৈরি, মোছা, এবং রক্ষণাবেক্ষণ -> ফাইলের নামকরণ, পাথ এবং নাম স্থান -> সম্পূর্ণ যোগ্যতা বনাম সম্পর্কিত পথগুলিC:C:dir

উইন্ডোজ এপিআই ফাংশনগুলির জন্য যা ফাইলগুলি পরিচালনা করে, ফাইলের নামগুলি প্রায়শই বর্তমান ডিরেক্টরিটির সাথে তুলনামূলক হতে পারে, যখন কিছু এপিআইয়ের পুরোপুরি যোগ্যতাসম্পন্ন পাথের প্রয়োজন হয়। কোনও ফাইলের নাম বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত হয় যদি এটি নীচের একটির সাথে শুরু না হয়:

  • যে কোনও বিন্যাসের একটি ইউএনসি নাম, যা সর্বদা দুটি ব্যাকস্ল্যাশ অক্ষর ("\") দিয়ে শুরু হয়। আরও তথ্যের জন্য, পরবর্তী বিভাগ দেখুন।
  • ব্যাকস্ল্যাশযুক্ত একটি ডিস্ক ডিজাইনার উদাহরণস্বরূপ "সি: \" বা "ডি: \"।
  • একটি একক ব্যাকস্ল্যাশ, উদাহরণস্বরূপ, "\ ডিরেক্টরি" বা "\ file.txt"। এটিকে পরম পথ হিসাবেও উল্লেখ করা হয়।

যদি কোনও ফাইলের নামটি কেবল ডিস্ক ডিজাইনার দিয়ে শুরু হয় তবে কোলনের পরে ব্যাকস্ল্যাশ হয় না, তবে এটি নির্দিষ্ট অক্ষরের সাহায্যে ড্রাইভের বর্তমান ডিরেক্টরিতে আপেক্ষিক পথ হিসাবে ব্যাখ্যা করা হয়। নোট করুন যে বর্তমান ডিরেক্টরিটি সেই ডিস্কের অতি সাম্প্রতিক "পরিবর্তন ডিরেক্টরি" অপারেশনের সময় সেট করা ছিল তার উপর নির্ভর করে মূল ডিরেক্টরি হতে পারে বা নাও হতে পারে। এই বিন্যাসের উদাহরণগুলি নিম্নরূপ:

  • "সি: tmp.txt" ড্রাইভ সিতে বর্তমান ডিরেক্টরিতে "tmp.txt" নামের একটি ফাইলকে বোঝায় C.
  • "সি: টেম্পিডির \ tmp.txt" সাব-ডিরেক্টরিতে একটি ফাইলকে ড্রাইভ সি-তে বর্তমান ডিরেক্টরিতে নির্দেশ করে

[...]


3
আমি এটি পছন্দ করি যে এটি অবৈধ পাথের জন্য ছুঁড়ে না, তবে এটি "সি:" এবং "সি: ডির" এর মতো পাথের জন্য সত্য ফিরে আসে, যা গেটফুলপাথ দ্বারা বর্তমান ডিরেক্টরি ব্যবহার করে সমাধান করা হয়েছে (যাতে তারা নিখুঁত নয়)। একটি উত্তর পোস্ট করেছে যা এগুলির জন্য মিথ্যা প্রত্যাবর্তন করে।
EM0

@ EM0 - ধন্যবাদ! তুমি আমাকে কিছু শিখিয়েছ :)
weir

15

চেষ্টা

System.IO.Path.IsPathRooted(template)

ইউএনসি পাথের পাশাপাশি স্থানীয়দের জন্যও কাজ করে।

যেমন

Path.IsPathRooted(@"\\MyServer\MyShare\MyDirectory")  // returns true
Path.IsPathRooted(@"C:\\MyDirectory")  // returns true

13

পুরানো প্রশ্ন, তবে আরও একটি প্রয়োগযোগ্য উত্তর। আপনার যদি ভলিউমটি কোনও স্থানীয় পথে অন্তর্ভুক্ত করা হয় তা নিশ্চিত করার প্রয়োজন হলে আপনি System.IO.Path.GetFullPath () এর মতো ব্যবহার করতে পারেন:

if (template == System.IO.Path.GetFullPath(template))
{
    ; //template is full path including volume or full UNC path
}
else
{
    if (useCurrentPathAndVolume)
        template = System.IO.Path.GetFullPath(template);
    else
        template = Assembly.GetExecutingAssembly().Location
}

3
এটিই আমার প্রয়োজন ছিল এবং মূল প্রশ্নটির কাছাকাছি বলে মনে হচ্ছে যেহেতু ইস্পথরুটড 'আপেক্ষিক পাথের জন্য সত্য নয় (
অবিচ্ছিন্নভাবে

GetFullPathফাইল সিস্টেম অ্যাক্সেস করে এবং বেশ কয়েকটি সম্ভাব্য ব্যতিক্রম ছুঁড়ে ফেলতে পারে। এমন একটি বিকল্পের জন্য আমার উত্তরটি ( স্ট্যাকওভারফ্লো.com/ a/ 35046453 / 704808 ) দেখুন যা এখনও সম্পূর্ণ পথ নিশ্চিত করে।
weir

11

ওয়েয়ারের উত্তরের উপর ভিত্তি করে তৈরি করা : এটি অবৈধ পাথের জন্য নয়, false"সি:", "সি: ডারনাম" এবং "\ পাথ" এর মতো পথের জন্যও ফিরে আসে ।

public static bool IsFullPath(string path)
{
    if (string.IsNullOrWhiteSpace(path) || path.IndexOfAny(Path.GetInvalidPathChars()) != -1 || !Path.IsPathRooted(path))
        return false;

    string pathRoot = Path.GetPathRoot(path);
    if (pathRoot.Length <= 2 && pathRoot != "/") // Accepts X:\ and \\UNC\PATH, rejects empty string, \ and X:, but accepts / to support Linux
        return false;

    if (pathRoot[0] != '\\' || pathRoot[1] != '\\')
        return true; // Rooted and not a UNC path

    return pathRoot.Trim('\\').IndexOf('\\') != -1; // A UNC server name without a share name (e.g "\\NAME" or "\\NAME\") is invalid
}

নোট করুন যে এটি উইন্ডোজ এবং লিনাক্সে বিভিন্ন ফলাফল দেয়, যেমন "/ পাথ" লিনাক্সের উপর পরম, তবে উইন্ডোজে নয়।

ইউনিট পরীক্ষা:

[Test]
public void IsFullPath()
{
    bool isWindows = Environment.OSVersion.Platform.ToString().StartsWith("Win"); // .NET Framework
    // bool isWindows = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows); // .NET Core

    // These are full paths on Windows, but not on Linux
    TryIsFullPath(@"C:\dir\file.ext", isWindows);
    TryIsFullPath(@"C:\dir\", isWindows);
    TryIsFullPath(@"C:\dir", isWindows);
    TryIsFullPath(@"C:\", isWindows);
    TryIsFullPath(@"\\unc\share\dir\file.ext", isWindows);
    TryIsFullPath(@"\\unc\share", isWindows);

    // These are full paths on Linux, but not on Windows
    TryIsFullPath(@"/some/file", !isWindows);
    TryIsFullPath(@"/dir", !isWindows);
    TryIsFullPath(@"/", !isWindows);

    // Not full paths on either Windows or Linux
    TryIsFullPath(@"file.ext", false);
    TryIsFullPath(@"dir\file.ext", false);
    TryIsFullPath(@"\dir\file.ext", false);
    TryIsFullPath(@"C:", false);
    TryIsFullPath(@"C:dir\file.ext", false);
    TryIsFullPath(@"\dir", false); // An "absolute", but not "full" path

    // Invalid on both Windows and Linux
    TryIsFullPath(null, false, false);
    TryIsFullPath("", false, false);
    TryIsFullPath("   ", false, false);
    TryIsFullPath(@"C:\inval|d", false, false);
    TryIsFullPath(@"\\is_this_a_dir_or_a_hostname", false, false);
    TryIsFullPath(@"\\is_this_a_dir_or_a_hostname\", false, !isWindows);
    TryIsFullPath(@"\\is_this_a_dir_or_a_hostname\\", false, !isWindows);
}

private static void TryIsFullPath(string path, bool expectedIsFull, bool expectedIsValid = true)
{
    Assert.AreEqual(expectedIsFull, PathUtils.IsFullPath(path), "IsFullPath('" + path + "')");

    if (expectedIsFull)
    {
        Assert.AreEqual(path, Path.GetFullPath(path));
    }
    else if (expectedIsValid)
    {
        Assert.AreNotEqual(path, Path.GetFullPath(path));
    }
    else
    {
        Assert.That(() => Path.GetFullPath(path), Throws.Exception);
    }
}

ভাল জিনিস. আমি লক্ষ্য করেছি যে এমএসডিএন.মাইক্রোসফট.এইন.ইউস / লিবারি / উইন্ডোস / ডেস্কটপ/… জানিয়েছে যে উইন্ডোজ কোনও পাথ আপেক্ষিক নয় যদি এটি 'একক ব্যাকস্ল্যাশ
Weir

1
ভাল যুক্তি! দেখে মনে হচ্ছে আমার পরিভাষাটি বন্ধ ছিল। আমি যখন "পরম পথ" বললাম তখন আমি সত্যিই এমএসকে "পুরো পথ" বলার বিষয়ে ভাবছিলাম। আমি নামটি পরিবর্তন করেছি এবং এর জন্য একটি পরীক্ষার কেস যুক্ত করেছি।
EM0

1
এই উত্তরের জন্য ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে। তবে নোট করুন যে কোনও ইউএনসি পাথের জন্য যেমন C সার্ভার \, পদ্ধতিটি সত্য হয়, তবে আপনি যদি ডিরেক্টরিকে নির্দেশ করেন Eএক্সজিস্টস (পাথ) (সিস্টেম.আরগমেন্ট এক্সেক্সেশন: 'ইউএনসি পাথটি ফর্মের হওয়া উচিত) \\ সার্ভার \ ভাগ করুন '')
কার্ল

2
লোকেরা এখনও এটি ব্যবহার করছে এবং নতুন প্রান্তের কেসগুলি খুঁজে পেয়ে খুব ভাল লাগছে @ কার্ল তার জন্য কোড এবং পরীক্ষাটি আপডেট করেছে!
EM0

6

কোনও পথ সম্পূর্ণরূপে যোগ্য (এমএসডিএন) রয়েছে কিনা তা পরীক্ষা করতে :

public static bool IsPathFullyQualified(string path)
{
    var root = Path.GetPathRoot(path);
    return root.StartsWith(@"\\") || root.EndsWith(@"\");
}

যা ইতিমধ্যে প্রস্তাবিত হয়েছে তার চেয়ে কিছুটা সহজ এবং এটি ড্রাইভ-আপেক্ষিক পাথের মতো এখনও মিথ্যা প্রত্যাবর্তন করে C:foo। এর যুক্তিটি সরাসরি "সম্পূর্ণ যোগ্যতাসম্পন্ন" এর এমএসডিএন সংজ্ঞার উপর ভিত্তি করে তৈরি করা হয়েছে এবং এটির কোনও ব্যবহারের উদাহরণ আমি পাই নি।


আকর্ষণীয়ভাবে তবে। নেট কোর ২.১ এ একটি নতুন পদ্ধতি রয়েছে Path.IsPathFullyQualifiedযা অভ্যন্তরীণ পদ্ধতি ব্যবহার করে PathInternal.IsPartiallyQualified(লিঙ্কের অবস্থানটি সঠিকভাবে 2018-04-17 হিসাবে সঠিকভাবে লিঙ্ক করেছে)।

এই পোস্টটির উত্তরোত্তর এবং আরও ভাল স্ব-সংযোজনের জন্য, এখানে রেফারেন্সের জন্য পরবর্তীগুলির বাস্তবায়ন:

internal static bool IsPartiallyQualified(ReadOnlySpan<char> path)
{
    if (path.Length < 2)
    {
        // It isn't fixed, it must be relative.  There is no way to specify a fixed
        // path with one character (or less).
        return true;
    }

    if (IsDirectorySeparator(path[0]))
    {
        // There is no valid way to specify a relative path with two initial slashes or
        // \? as ? isn't valid for drive relative paths and \??\ is equivalent to \\?\
        return !(path[1] == '?' || IsDirectorySeparator(path[1]));
    }

    // The only way to specify a fixed path that doesn't begin with two slashes
    // is the drive, colon, slash format- i.e. C:\
    return !((path.Length >= 3)
        && (path[1] == VolumeSeparatorChar)
        && IsDirectorySeparator(path[2])
        // To match old behavior we'll check the drive character for validity as the path is technically
        // not qualified if you don't have a valid drive. "=:\" is the "=" file's default data stream.
        && IsValidDriveChar(path[0]));
}

4

এই আমি ব্যবহার সমাধান

public static bool IsFullPath(string path)
{
    try
    {
        return Path.GetFullPath(path) == path;
    }
    catch
    {
        return false;
    }
}

এটি নিম্নলিখিত পদ্ধতিতে কাজ করে:

IsFullPath(@"c:\foo"); // true
IsFullPath(@"C:\foo"); // true
IsFullPath(@"c:\foo\"); // true
IsFullPath(@"c:/foo"); // false
IsFullPath(@"\foo"); // false
IsFullPath(@"foo"); // false
IsFullPath(@"c:1\foo\"); // false

খুব আকর্ষণীয়! এটি ভঙ্গুর, উদাহরণস্বরূপ, স্ল্যাশ প্রকারের সাথে মিল করতে হবে, তবে এটির প্রতিশ্রুতি রয়েছে।
নিকোলাস পিটারসন

এটি নিম্নলিখিত পাথগুলির জন্য ভুল ফলাফল দেয়: C:\foo\..\fooবাC:\foo\.\.\.
সার্জটেক

1

নিম্নলিখিত ফাংশন কল করুন:

Path.IsPathFullyQualified(@"c:\foo")

এমএসডিএন ডক: পাথ.আইএসপথফুল্লিফিকেশন পদ্ধতি

এমএসডিএন ডকের দরকারী উদ্ধৃতিটি নিম্নলিখিত:

এই পদ্ধতিটি এমন পথগুলি পরিচালনা করে যা বিকল্প ডিরেক্টরি বিভাজক ব্যবহার করে। এটি ধরে নেওয়া প্রায়শই ভুল যে মূলযুক্ত পাথগুলি ( ইসপথরোটেড (স্ট্রিং) ) আপেক্ষিক নয়। উদাহরণস্বরূপ, "সি: এ" ড্রাইভ সম্পর্কিত "সি: \ এ" মূলযুক্ত এবং আপেক্ষিক নয়, যা বর্তমান ডিরেক্টরিটি পরিবর্তনের জন্য ব্যবহৃত হয় না।


0

আপনি পুরো পাথ দ্বারা কী বোঝাতে চেয়েছেন তা সত্যই আমি নিশ্চিত নই (যদিও উদাহরণটি ধরে নিলে আপনি মূল থেকে অপেক্ষাকৃত আপত্তি বোঝাচ্ছেন), ভাল, আপনি শারীরিক ফাইল সিস্টেমের পথগুলিতে কাজ করতে সহায়তার জন্য পাথ শ্রেণিটি ব্যবহার করতে পারেন , যা আবরণ করা উচিত আপনি সবচেয়ে ঘটনা জন্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.