কোনও পথ বৈধ কিনা তা পরীক্ষা করে দেখুন


110

আমি কেবল ভাবছি: প্রদত্ত পথটি বৈধ হলে আমি বৈধতা দেওয়ার উপায় খুঁজছি। (দ্রষ্টব্য: কোনও ফাইল বিদ্যমান কিনা তা আমি যাচাই করতে চাই না! আমি কেবলমাত্র পথের বৈধতা প্রমাণ করতে চাই - সুতরাং যদি কোনও ফাইল সম্ভবত অবস্থানে উপস্থিত থাকতে পারে)

সমস্যাটি হ'ল আমি নেট নেট এপিআই তে কিছু খুঁজে পাচ্ছি না। উইন্ডোজ সমর্থন করে এমন অনেক ফর্ম্যাট এবং অবস্থানের কারণে আমি বরং এমএস-নেটিভ কিছু ব্যবহার করব।

যেহেতু ফাংশনটির বিরুদ্ধে পরীক্ষা করতে সক্ষম হওয়া উচিত:

  • আপেক্ষিক পথ (./)
  • পরম পাথ (সি: \ tmp)
  • ইউএনসি-প্যাথস (\ কিছু-পিসি \ সি $)
  • সম্পূর্ণ পাথ 1024 টি অক্ষরের মতো এনটিএফএস-সীমাবদ্ধতা - আমি যদি ভুল করে পথটি অতিক্রম না করি তবে অনেকগুলি অভ্যন্তরীণ উইন্ডোজ ফাংশনগুলির জন্য একটি ফাইলকে অ্যাক্সেসযোগ্য করে তুলবে। এক্সপ্লোরারের সাথে এটির নামকরণ এখনও কাজ করে
  • ভলিউম জিইউডি পাথ: "\? \ ভলিউম {জিইউইডি \ \ somefile.foo

কারও কি এর মতো ফাংশন আছে?


উত্তর:


58

চেষ্টা করুন Uri.IsWellFormedUriString():

  • স্ট্রিংটি সঠিকভাবে পালানো যায় না।

    http://www.example.com/path???/file name
  • স্ট্রিংটি একটি পরম উরি যা একটি অন্তর্নিহিত ফাইল উরি উপস্থাপন করে।

    c:\\directory\filename
  • স্ট্রিংটি একটি পরম ইউআরআই যা পথের আগে একটি স্ল্যাশ অনুপস্থিত।

    file://c:/directory/filename
  • স্ট্রিংটিতে অনস্কেপড ব্যাকস্ল্যাশ রয়েছে যদিও এগুলি ফরোয়ার্ড স্ল্যাশ হিসাবে বিবেচনা করা হয়।

    http:\\host/path/file
  • স্ট্রিংটি একটি শ্রেণিবিন্যাসিক পরম উরি প্রতিনিধিত্ব করে এবং এতে ": //" থাকে না।

    www.example.com/path/file
  • ইউরি.স্কিমের পার্সারটি নির্দেশ করে যে আসল স্ট্রিংটি সুগঠিত ছিল না।

    The example depends on the scheme of the URI.

9
এটি এর জন্য মিথ্যা প্রত্যাবর্তন করে @"foo\bar\baz"যা
একদমই

5
টমাস: আপনি কি ইউরিকাইন্ড নির্দিষ্ট করেছেন? আপনি নিখুঁত, আপেক্ষিক বা AbsolveOrRelative ব্যবহার করতে পারেন।
ড্যান গোরান লুন্ডে

1
এমনকি উরিকিন্ডকে আপেক্ষিক বা নিখুঁত ও সম্পর্কিত সম্পর্কিত হিসাবেও এটি থমাসের মতো আপেক্ষিক পাথের জন্য কাজ করে না। পরিবর্তে আমি পটকোর উত্তরটি ব্যবহার করে শেষ করেছি এবং এটি আমার উদ্দেশ্যে কাজ করে।
জননিএম

1
আমি দেখতে পেলাম যে \\ কম্পিউটারনাম \ স্পেস সহ দির নাম \ ফাইলনাম যেমন ইসওয়েলফর্মডিউরিস্ট্রিং (আমার প্রাথমিক প্রত্যাশার বিপরীতে) ব্যবহার করার সময় একটি ব্যতিক্রম ছুঁড়ে ফেলেছে, কারণ স্পেসগুলি সঠিকভাবে এনকোড করা হয়নি। আমি দেখতে পেয়েছি যে আমি কেবল উরি (স্ট্রিং) কনস্ট্রাক্টরকে আমার বৈধতা হিসাবে ব্যবহার করতে পারি, এর ফলে, বৈধতা দেওয়ার আগে স্ট্রিংটি সঠিকভাবে এনকোড না করে।
quintessential5

3
পুরোপুরি সূক্ষ্ম ফাইলের পথে মিথ্যা ফিরিয়ে দেয়।
এভেজেনি পেট্রোভ

29

: সমাধান "LamdaComplex" দ্বারা পোস্ট করা ব্যবহার করে, একই থ্রেডে, আরো সঠিক বলে মনে হয় stackoverflow.com/a/11636052/2546739
Xav987

7
private bool IsValidPath(string path)
{
    Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");
    if (!driveCheck.IsMatch(path.Substring(0, 3))) return false;
    string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars());
    strTheseAreInvalidFileNameChars += @":/?*" + "\"";
    Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]");
    if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
        return false;

    DirectoryInfo dir = new DirectoryInfo(Path.GetFullPath(path));
    if (!dir.Exists)
        dir.Create();
    return true;
}

7

নীচের কোডটি নিয়ে আমার কোনও সমস্যা হয়নি। (আপেক্ষিক পাথগুলি অবশ্যই '/' বা '\' দিয়ে শুরু করা উচিত)।

private bool IsValidPath(string path, bool allowRelativePaths = false)
{
    bool isValid = true;

    try
    {
        string fullPath = Path.GetFullPath(path);

        if (allowRelativePaths)
        {
            isValid = Path.IsPathRooted(path);
        }
        else
        {
            string root = Path.GetPathRoot(path);
            isValid = string.IsNullOrEmpty(root.Trim(new char[] { '\\', '/' })) == false;
        }
    }
    catch(Exception ex)
    {
        isValid = false;
    }

    return isValid;
}

উদাহরণস্বরূপ এগুলি মিথ্যা ফিরে আসবে:

IsValidPath("C:/abc*d");
IsValidPath("C:/abc?d");
IsValidPath("C:/abc\"d");
IsValidPath("C:/abc<d");
IsValidPath("C:/abc>d");
IsValidPath("C:/abc|d");
IsValidPath("C:/abc:d");
IsValidPath("");
IsValidPath("./abc");
IsValidPath("./abc", true);
IsValidPath("/abc");
IsValidPath("abc");
IsValidPath("abc", true);

এবং এগুলি সত্য ফিরে আসবে:

IsValidPath(@"C:\\abc");
IsValidPath(@"F:\FILES\");
IsValidPath(@"C:\\abc.docx\\defg.docx");
IsValidPath(@"C:/abc/defg");
IsValidPath(@"C:\\\//\/\\/\\\/abc/\/\/\/\///\\\//\defg");
IsValidPath(@"C:/abc/def~`!@#$%^&()_-+={[}];',.g");
IsValidPath(@"C:\\\\\abc////////defg");
IsValidPath(@"/abc", true);
IsValidPath(@"\abc", true);

3

আপনি এই কোড চেষ্টা করতে পারেন:

try
{
  Path.GetDirectoryName(myPath);
}
catch
{
  // Path is not valid
}

আমি নিশ্চিত না যে এটি সমস্ত মামলা কভার করে ...


2

আমি যে নিকটে এসেছি তা হ'ল এটি তৈরির চেষ্টা করে এবং এটি সফল হয় কিনা তা দেখে।


2

এখানে প্রচুর ভাল সমাধান রয়েছে, তবে এরপরে কেউই নেই যে চলাচলটি একটি বিদ্যমান ড্রাইভের সাথে এখানে যুক্ত রয়েছে কিনা তা পরীক্ষা করে দেখুন:

private bool IsValidPath(string path)
{
    // Check if the path is rooted in a driver
    if (path.Length < 3) return false;
    Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");
    if (!driveCheck.IsMatch(path.Substring(0, 3))) return false;

    // Check if such driver exists
    IEnumerable<string> allMachineDrivers = DriveInfo.GetDrives().Select(drive => drive.Name);
    if (!allMachineDrivers.Contains(path.Substring(0, 3))) return false;

    // Check if the rest of the path is valid
    string InvalidFileNameChars = new string(Path.GetInvalidPathChars());
    InvalidFileNameChars += @":/?*" + "\"";
    Regex containsABadCharacter = new Regex("[" + Regex.Escape(InvalidFileNameChars) + "]");
    if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
        return false;
    if (path[path.Length - 1] == '.') return false;

    return true;
}

এই সমাধানটি আপেক্ষিক পাথগুলিকে বিবেচনা করে না


1

থেকে অবৈধ অক্ষর পান System.IO.Path.GetInvalidPathChars();এবং আপনার স্ট্রিং (ডিরেক্টরি পাথ) এ সেগুলি রয়েছে কিনা তা পরীক্ষা করুন।


3
এটি সম্পূর্ণরূপে বৈধ নয়। "C: \ new.folder" বৈধ যখন "C: \ newfolder"। এটি না. '।' কোনও পাথ / ফাইলের নামের জন্য একটি বৈধ অক্ষর, তবে ইউরির শেষে নয়।
ক্লাউডেকেনিলোল

0

4
"[...] কোনও ফাইল বিদ্যমান কিনা তা পরীক্ষা করতে চান না!"
স্টিফান

3
বিদ্যমান পরীক্ষার জন্য ডিরেক্টরিটি পরীক্ষার জন্য এটি বৈধ পথ নয় (যেখানে কোনও ব্যক্তির উপস্থিতি থাকতে পারে, বা তৈরি করা যেতে পারে, যথাযথ প্রাইভেলিজ দেওয়া হয়েছে)
মার্টিজন

3
@ জেসন - এটি ফাইলটি পরীক্ষা করে না, কেবলমাত্র এতে থাকা ফোল্ডার।
মার্কস্মিথ

8
তবে একটি বৈধ ডিরেক্টরি পাথ এখনও বিদ্যমান থাকতে পারে।
স্টিফান

-2
private bool IsValidPath(string path)
{
    Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");

    if (string.IsNullOrWhiteSpace(path) || path.Length < 3)
    {
        return false;
    }

    if (!driveCheck.IsMatch(path.Substring(0, 3)))
    {
        return false;
    }

    var x1 = (path.Substring(3, path.Length - 3));
    string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars());
    strTheseAreInvalidFileNameChars += @":?*";
    Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]");

    if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
    {
        return false;
    }

    var driveLetterWithColonAndSlash = Path.GetPathRoot(path);

    if (!DriveInfo.GetDrives().Any(x => x.Name == driveLetterWithColonAndSlash))
    {
        return false;
    }

    return true;
}

1
এক্স 1 এর উদ্দেশ্য কী?
জয়জয়


-4

পথটি অর্ধপথ ঠিক আছে কিনা তা নিশ্চিত করার জন্য আপনি Path.IsPathRooted () ব্যবহার করার চেষ্টা করতে পারেন।

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