উত্তর:
ব্যবহার করার চেষ্টা করবেন 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"
IsPathRooted
: ফাইল সিস্টেমে অ্যাক্সেস এড়ানো বা অবৈধ ইনপুটটির জন্য ব্যতিক্রম ছোঁড়া।
IsPathRooted
, এটি অবশ্যই তেমন উল্লেখযোগ্য কিছু ছিল না। GetFullPath
লাইন, যাতে অন্তর্ভুক্ত করা হয় সেই পথ মূল্যায়ন হচ্ছে পরিলক্ষিত হতে পারে
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" সাব-ডিরেক্টরিতে একটি ফাইলকে ড্রাইভ সি-তে বর্তমান ডিরেক্টরিতে নির্দেশ করে
[...]
পুরানো প্রশ্ন, তবে আরও একটি প্রয়োগযোগ্য উত্তর। আপনার যদি ভলিউমটি কোনও স্থানীয় পথে অন্তর্ভুক্ত করা হয় তা নিশ্চিত করার প্রয়োজন হলে আপনি 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
}
GetFullPath
ফাইল সিস্টেম অ্যাক্সেস করে এবং বেশ কয়েকটি সম্ভাব্য ব্যতিক্রম ছুঁড়ে ফেলতে পারে। এমন একটি বিকল্পের জন্য আমার উত্তরটি ( স্ট্যাকওভারফ্লো.com/ a/ 35046453 / 704808 ) দেখুন যা এখনও সম্পূর্ণ পথ নিশ্চিত করে।
ওয়েয়ারের উত্তরের উপর ভিত্তি করে তৈরি করা : এটি অবৈধ পাথের জন্য নয়, 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);
}
}
কোনও পথ সম্পূর্ণরূপে যোগ্য (এমএসডিএন) রয়েছে কিনা তা পরীক্ষা করতে :
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]));
}
এই আমি ব্যবহার সমাধান
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\.\.\.
নিম্নলিখিত ফাংশন কল করুন:
Path.IsPathFullyQualified(@"c:\foo")
এমএসডিএন ডক: পাথ.আইএসপথফুল্লিফিকেশন পদ্ধতি
এমএসডিএন ডকের দরকারী উদ্ধৃতিটি নিম্নলিখিত:
এই পদ্ধতিটি এমন পথগুলি পরিচালনা করে যা বিকল্প ডিরেক্টরি বিভাজক ব্যবহার করে। এটি ধরে নেওয়া প্রায়শই ভুল যে মূলযুক্ত পাথগুলি ( ইসপথরোটেড (স্ট্রিং) ) আপেক্ষিক নয়। উদাহরণস্বরূপ, "সি: এ" ড্রাইভ সম্পর্কিত "সি: \ এ" মূলযুক্ত এবং আপেক্ষিক নয়, যা বর্তমান ডিরেক্টরিটি পরিবর্তনের জন্য ব্যবহৃত হয় না।
আপনি পুরো পাথ দ্বারা কী বোঝাতে চেয়েছেন তা সত্যই আমি নিশ্চিত নই (যদিও উদাহরণটি ধরে নিলে আপনি মূল থেকে অপেক্ষাকৃত আপত্তি বোঝাচ্ছেন), ভাল, আপনি শারীরিক ফাইল সিস্টেমের পথগুলিতে কাজ করতে সহায়তার জন্য পাথ শ্রেণিটি ব্যবহার করতে পারেন , যা আবরণ করা উচিত আপনি সবচেয়ে ঘটনা জন্য।