কোনও স্ট্রিং একটি বৈধ উইন্ডোজ ডিরেক্টরি (ফোল্ডার) পাথ কিনা তা পরীক্ষা করুন


84

আমি কোনও ব্যবহারকারী দ্বারা স্ট্রিং ইনপুট কোনও ফোল্ডারের পাথ উপস্থাপনের জন্য বৈধ কিনা তা নির্ধারণ করার চেষ্টা করছি। বৈধ দ্বারা, আমি সঠিকভাবে ফর্ম্যাট বলতে চাই।

আমার অ্যাপ্লিকেশনটিতে, ফোল্ডারটি একটি ইনস্টলেশন গন্তব্য উপস্থাপন করে। তবে শর্ত থাকে যে ফোল্ডারের পাথ হয় বৈধ, আমি কিনা তা নির্ধারণ করতে ফোল্ডারের বিদ্যমান চান, এবং এটি তৈরি যদি এটা না।

আমি বর্তমানে ব্যবহার করছি IO.Directory.Exists( String path )। আমি দেখতে পেয়েছি যে ব্যবহারকারী স্ট্রিংটি সঠিকভাবে ফর্ম্যাট না করে ব্যতীত এটি কাজ করে। যখন এটি হয়, এই পদ্ধতিটি মিথ্যা ফিরে আসবে যা ইঙ্গিত দেয় যে ফোল্ডারটির অস্তিত্ব নেই। তবে এটি একটি সমস্যা কারণ আমি পরে ফোল্ডারটি তৈরি করতে সক্ষম হব না।

আমার গুগলিং থেকে আমি ফর্ম্যাটটি সঠিক কিনা তা পরীক্ষা করার জন্য একটি নিয়মিত অভিব্যক্তি ব্যবহার করার পরামর্শ পেয়েছি found নিয়মিত প্রকাশের সাথে আমার কোনও অভিজ্ঞতা নেই এবং আমি ভাবছি যে এটি যদি একটি কার্যকর পদ্ধতির হয়। আমি যা পেয়েছি তা এখানে:

Regex r = new Regex( @"^(([a-zA-Z]\:)|(\\))(\\{1}|((\\{1})[^\\]([^/:*?<>""|]*))+)$" );
return r.IsMatch( path );

এর সাথে মিলে একটি নিয়মিত অভিব্যক্তি পরীক্ষা কি Directory.Exists()আমাকে পথটি বৈধ কিনা তা পরীক্ষা করার জন্য একটি ভাল পর্যাপ্ত পদ্ধতি দেয় এবং এটি বিদ্যমান কিনা? আমি জানি এটি ওএস এবং অন্যান্য বিষয়গুলির সাথে পৃথক হবে, তবে প্রোগ্রামটি কেবল উইন্ডোজ ব্যবহারকারীদের জন্যই লক্ষ্যযুক্ত ।


4
যদি এটি ডিরেক্টরিটি ডিরেক্টরী তৈরির পরে তৈরি না করে x
রবার্ট হার্ভে



4
@ রবার্টি এই প্রশ্নটি দেখেছি এবং এটি সাধারণ নিয়ম ব্যতীত কোনও নির্দিষ্ট উত্তর দেয় না। ২ য় সর্বোচ্চ উত্তরে ফর্ম্যাটিংটি কভার করা হয়নি তবে কেবল অবৈধ অক্ষর। এছাড়াও ডিরেক্টরি। এক্সিজিস্ট পদ্ধতিটি মিথ্যা ফিরিয়ে দিতে পারে, তবে যেহেতু আমি সেই স্থানে ফোল্ডারটি তৈরির বিকল্পটি চাই আমি কেবল এটি দিয়ে যেতে পারি না।
পুডপুদুক

@ রবার্ট ২ য় বিষয়ে আপনি সংযুক্ত করেছেন - একটি শব্দে টাইপ করা এখনও সেই প্রশ্নের উত্তরে প্রদত্ত বৈধতাটি পাস করবে।
পুডপুদুক

উত্তর:


119

কল Path.GetFullPath; পথটি অবৈধ থাকলে এটি ব্যতিক্রম ছুঁড়ে দেবে।

আপেক্ষিক পাথগুলি (যেমন Word) অস্বীকার করতে কল করুন Path.IsPathRooted


আমি জানতাম কিছু সহজ ছিল! এবং ধন্যবাদ, আমি পথ-সম্পর্কিত-আপেক্ষিক সমস্যার কথা ভাবি নি।
পুডপুদুক

4
ধন্যবাদ স্লাকস। আমি অনেকগুলি সদৃশ দেখেছি এবং অনেকগুলি গুগল অনুসন্ধান করেছি (একাধিক উপলক্ষে), তবে এই প্রথম প্রশ্নের প্রথম বার আমি এই উত্তরের প্রশ্নের ভাল উত্তর দেখেছি।
রবার্ট হার্ভে

4
Path.GetFullPath ("con.txt") একটি বৈধ ফাইলের নাম।
ক্রিস্টোফার

8
@ স্ল্যাকস এটি মন্তব্য করা খুব পুরানো, তবে আমি আপনাকে আমার ভোট -১ এর ভোট দেওয়ার কারণে এখানে একটি রেখে যেতে চাই। পাথ.গেটফুলপাথ () মনে হচ্ছে ঠিক আছে, তবে কী হবে যদি পথটি হয়: "জেড: \\\\\\\\ হাই" সেখানে ", এটি একটি বৈধ পরম পথ নয় তবে পথ। গেটফুলপথ (...) ফলাফলটি দেয়: জেড: \ হাই \ সেখানে কোনও ব্যতিক্রম উত্থাপিত হয় না। গেটফুলপ্যাথ () এর সাথে ফিরে আসা স্ট্রিং এবং এর মতো মূল স্ট্রিংটির তুলনা করে আমাকে এটি একটু পরিবর্তন করতে হয়েছিল: প্রাইভেট বুল ইসপথভালিড (স্ট্রিং পাথ) {চেষ্টা করুন {স্ট্রিং ফুলপ্যাথ = পথ .GetFullPath (পথ); রিটার্ন ফুলপথ == পথ; } ক্যাচ false প্রত্যাবর্তন মিথ্যা;}}
কিং কিং

4
এই লিনাক্স থেকে ইউনিক্স.স্ট্যাকেক্সেঞ্জঞ্জ ডটকম- এ কিংকিংয়ের উত্তর : "একাধিক স্ল্যাশ অনুমোদিত এবং এটি একক স্ল্যাশের সমতুল্য .." আমি উইন্ডোতেও এটি পর্যবেক্ষণ করেছি (যদিও ইউএনসি পথে অগ্রণী স্ল্যাশগুলি আলাদাভাবে বিবেচনা করা যেতে পারে)। এই প্রমাণ, একটি কমান্ড প্রম্পটে, এই চেষ্টা করে দেখুন: cd C:\\\\\\\Windows\\\\\\\System32। উইন্ডোজের জন্য, আমি এমন কোনও অনুমোদনযোগ্য উত্স খুঁজে পাই না যা এই আচরণটির নথি দেয়, তবে অবশ্যই এটির জন্য একটি পয়েন্টারকে স্বাগত জানায়।
ডেভিডআরআর

18

আমি আসলে স্ল্যাक्सের সাথে একমত নই। এই সমাধানটি আমার পক্ষে কার্যকর হয়নি। প্রত্যাশা মতো ব্যতিক্রম ঘটেনি। তবে এই কোডটি আমার পক্ষে কাজ করেছে:

if(System.IO.Directory.Exists(path))
{
    ...
}

64
একটি বৈধ পথ অগত্যা যে কোনও ডিরেক্টরি উপস্থিত থাকে তা নয় ... যা এখানে ঠিক জিজ্ঞাসা করা সমস্যা
বেনলিটজ

4
প্রশ্নটি পথের স্ট্রিংয়ের বৈধতার সাথে সম্পর্কিত ছিল, এমন একটি পথ যা বিদ্যমান থাকতে পারে না।
মুবাশার

আমি মনে করি এই উপায়টি সঠিক। ব্যতিক্রম আশা করা উচিত নয়। এই পদ্ধতিটি প্রদত্ত পথে ভুল অক্ষরগুলিও পরীক্ষা করে।
ইউজিন মাকসিমভ

ডিরেক্টরি "ডিরেক্টরি" বাস্তব পথ হিসাবে না পাওয়া গেলে এই শর্তটি নিজেই ব্যতিক্রম ঘটায় x এক্সিস্টদের একটি বৈধ পথের প্রয়োজন ists
এম ফাওয়াদ সুরোষ

সম্পূর্ণ ভুল উত্তর! আমি অবাক হয়েছি যে এটি কীভাবে 32 টি আপলোড পেয়েছে (এখন অবধি)। অবশ্যই এমন লোকদের দ্বারা হওয়া উচিত যারা তাদের যে সমস্যার মুখোমুখি হয়েছিল তার জন্য ভুল জায়গাটির দিকে চেয়ে ছিল এবং তারা এতে হোঁচট খেয়েছে।
Sнаđошƒаӽ

13

পাথ.গেটফুলপাথ কেবল ব্যতিক্রমগুলি নীচে দেয়

আর্গুমেন্টএক্সেপশন পাথটি একটি শূন্য দৈর্ঘ্যের স্ট্রিং, এতে কেবল সাদা স্থান থাকে বা এক বা একাধিক অবৈধ অক্ষরগুলিকে গেটআইনুডিয়ালিপ্যাথচারে সংজ্ঞায়িত করা হয়। -অর- সিস্টেম পরম পথটি পুনরুদ্ধার করতে পারেনি।

সিকিউরিটি এক্সসেপশন কলারের কাছে প্রয়োজনীয় অনুমতি নেই।

আর্গুমেন্টনলএক্সেপশন পথটি শূন্য।

নোট সাপোর্টেড এক্সসেপশন পাথটিতে একটি কোলন (":") রয়েছে যা ভলিউম শনাক্তকারীর অংশ নয় (উদাহরণস্বরূপ, "c: \")।

PathTooLongException নির্দিষ্ট পাথ, ফাইলের নাম বা উভয়ই সিস্টেম-সংজ্ঞায়িত সর্বাধিক দৈর্ঘ্যের চেয়ে বেশি। উদাহরণস্বরূপ, উইন্ডোজ-ভিত্তিক প্ল্যাটফর্মগুলিতে, পাথগুলি অবশ্যই 248 টির চেয়ে কম বর্ণের হতে হবে এবং ফাইলের নাম অবশ্যই 260 টি অক্ষরের চেয়ে কম হওয়া উচিত।

বিকল্প উপায় নিম্নলিখিত ব্যবহার করা হয়:

/// <summary>
/// Validate the Path. If path is relative append the path to the project directory by default.
/// </summary>
/// <param name="path">Path to validate</param>
/// <param name="RelativePath">Relative path</param>
/// <param name="Extension">If want to check for File Path</param>
/// <returns></returns>
private static bool ValidateDllPath(ref string path, string RelativePath = "", string Extension = "")
{
    // Check if it contains any Invalid Characters.
    if (path.IndexOfAny(Path.GetInvalidPathChars()) == -1)
    {
        try
        {
            // If path is relative take %IGXLROOT% as the base directory
            if (!Path.IsPathRooted(path))
            {
                if (string.IsNullOrEmpty(RelativePath))
                {
                    // Exceptions handled by Path.GetFullPath
                    // ArgumentException path is a zero-length string, contains only white space, or contains one or more of the invalid characters defined in GetInvalidPathChars. -or- The system could not retrieve the absolute path.
                    // 
                    // SecurityException The caller does not have the required permissions.
                    // 
                    // ArgumentNullException path is null.
                    // 
                    // NotSupportedException path contains a colon (":") that is not part of a volume identifier (for example, "c:\"). 
                    // PathTooLongException The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 characters.

                    // RelativePath is not passed so we would take the project path 
                    path = Path.GetFullPath(RelativePath);

                }
                else
                {
                    // Make sure the path is relative to the RelativePath and not our project directory
                    path = Path.Combine(RelativePath, path);
                }
            }

            // Exceptions from FileInfo Constructor:
            //   System.ArgumentNullException:
            //     fileName is null.
            //
            //   System.Security.SecurityException:
            //     The caller does not have the required permission.
            //
            //   System.ArgumentException:
            //     The file name is empty, contains only white spaces, or contains invalid characters.
            //
            //   System.IO.PathTooLongException:
            //     The specified path, file name, or both exceed the system-defined maximum
            //     length. For example, on Windows-based platforms, paths must be less than
            //     248 characters, and file names must be less than 260 characters.
            //
            //   System.NotSupportedException:
            //     fileName contains a colon (:) in the middle of the string.
            FileInfo fileInfo = new FileInfo(path);

            // Exceptions using FileInfo.Length:
            //   System.IO.IOException:
            //     System.IO.FileSystemInfo.Refresh() cannot update the state of the file or
            //     directory.
            //
            //   System.IO.FileNotFoundException:
            //     The file does not exist.-or- The Length property is called for a directory.
            bool throwEx = fileInfo.Length == -1;

            // Exceptions using FileInfo.IsReadOnly:
            //   System.UnauthorizedAccessException:
            //     Access to fileName is denied.
            //     The file described by the current System.IO.FileInfo object is read-only.-or-
            //     This operation is not supported on the current platform.-or- The caller does
            //     not have the required permission.
            throwEx = fileInfo.IsReadOnly;

            if (!string.IsNullOrEmpty(Extension))
            {
                // Validate the Extension of the file.
                if (Path.GetExtension(path).Equals(Extension, StringComparison.InvariantCultureIgnoreCase))
                {
                    // Trim the Library Path
                    path = path.Trim();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return true;

            }
        }
        catch (ArgumentNullException)
        {
            //   System.ArgumentNullException:
            //     fileName is null.
        }
        catch (System.Security.SecurityException)
        {
            //   System.Security.SecurityException:
            //     The caller does not have the required permission.
        }
        catch (ArgumentException)
        {
            //   System.ArgumentException:
            //     The file name is empty, contains only white spaces, or contains invalid characters.
        }
        catch (UnauthorizedAccessException)
        {
            //   System.UnauthorizedAccessException:
            //     Access to fileName is denied.
        }
        catch (PathTooLongException)
        {
            //   System.IO.PathTooLongException:
            //     The specified path, file name, or both exceed the system-defined maximum
            //     length. For example, on Windows-based platforms, paths must be less than
            //     248 characters, and file names must be less than 260 characters.
        }
        catch (NotSupportedException)
        {
            //   System.NotSupportedException:
            //     fileName contains a colon (:) in the middle of the string.
        }
        catch (FileNotFoundException)
        {
            // System.FileNotFoundException
            //  The exception that is thrown when an attempt to access a file that does not
            //  exist on disk fails.
        }
        catch (IOException)
        {
            //   System.IO.IOException:
            //     An I/O error occurred while opening the file.
        }
        catch (Exception)
        {
            // Unknown Exception. Might be due to wrong case or nulll checks.
        }
    }
    else
    {
        // Path contains invalid characters
    }
    return false;
}

9

এখানে এমন একটি সমাধান রয়েছে যা @ এসএলক্সের উত্তরে প্রস্তাবিত গেটফুলপ্যাথের পাথের ব্যবহারকে উপকৃত করে

কোড যে আমি এখানে অন্তর্ভুক্ত করছি, নোট যে IsValidPath(string path)যেমন যে আহ্বানকারী নেই ডিজাইন করা হয়েছে না সম্পর্কে চিন্তা করতে হবে ব্যতিক্রম হ্যান্ডলিং

এছাড়াও আপনি খুঁজে পেতে পারেন পদ্ধতি এটি আহ্বান, যে TryGetFullPath(...), এছাড়াও তার নিজের উপর যোগ্যতা আছে যখন আপনি নিরাপদে কোনও পেতে প্রচেষ্টা করতে ইচ্ছুক পথটি

/// <summary>
/// Gets a value that indicates whether <paramref name="path"/>
/// is a valid path.
/// </summary>
/// <returns>Returns <c>true</c> if <paramref name="path"/> is a
/// valid path; <c>false</c> otherwise. Also returns <c>false</c> if
/// the caller does not have the required permissions to access
/// <paramref name="path"/>.
/// </returns>
/// <seealso cref="Path.GetFullPath"/>
/// <seealso cref="TryGetFullPath"/>
public static bool IsValidPath(string path)
{
    string result;
    return TryGetFullPath(path, out result);
}

/// <summary>
/// Returns the absolute path for the specified path string. A return
/// value indicates whether the conversion succeeded.
/// </summary>
/// <param name="path">The file or directory for which to obtain absolute
/// path information.
/// </param>
/// <param name="result">When this method returns, contains the absolute
/// path representation of <paramref name="path"/>, if the conversion
/// succeeded, or <see cref="String.Empty"/> if the conversion failed.
/// The conversion fails if <paramref name="path"/> is null or
/// <see cref="String.Empty"/>, or is not of the correct format. This
/// parameter is passed uninitialized; any value originally supplied
/// in <paramref name="result"/> will be overwritten.
/// </param>
/// <returns><c>true</c> if <paramref name="path"/> was converted
/// to an absolute path successfully; otherwise, false.
/// </returns>
/// <seealso cref="Path.GetFullPath"/>
/// <seealso cref="IsValidPath"/>
public static bool TryGetFullPath(string path, out string result)
{
    result = String.Empty;
    if (String.IsNullOrWhiteSpace(path)) { return false; }
    bool status = false;

    try
    {
        result = Path.GetFullPath(path);
        status = true;
    }
    catch (ArgumentException) { }
    catch (SecurityException) { }
    catch (NotSupportedException) { }
    catch (PathTooLongException) { }

    return status;
}

6

এই কোড ব্যবহার করুন

string DirectoryName = "Sample Name For Directory Or File";
Path.GetInvalidFileNameChars()
  .Where(x => DirectoryName.Contains(x))
  .Count() > 0 || DirectoryName == "con"

4
একই জিনিসটি সম্পাদন করার জন্য সামান্য সংক্ষিপ্ত কোড:Path.GetInvalidFileNameChars().Any(DirectoryName.Contains) || DirectoryName == "con"
06

4
পছন্দ করেছেন এমএসডিএন-তে ফাইল, পাথ এবং নেমস্পেসের নামকরণ থেকে : "কোনও ফাইলের নামের জন্য নিম্নলিখিত সংরক্ষিত নাম ব্যবহার করবেন না: সিওএন, পিআরএন, এউএক্স, নুল, সিওএম 1, সিওএম 2, সিওএম 3, সিওএম 4, সিওএম 5, সিওএম 6, সিওএম 7, সিওএম 8, । COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 এবং LPT9 এছাড়াও এই নামগুলি এড়াতে একটি এক্সটেনশন দ্বারা অবিলম্বে অনুসৃত উদাহরণস্বরূপ, NUL.txt বাঞ্ছনীয় নয় আরো তথ্যের জন্য, দেখুন। নামস্থান "।
ডেভিডআরআর

এই "ব্ল্যাকলিস্ট এপ্রোচ" প্রতিটি উইন্ডোজ সিস্টেমে কাজ করে না, উদাহরণস্বরূপ যখন একটি চিত্রগ্রন্থগুলি দেখায়: en.wikedia.org/wiki/Miscellaneous_Symbols_and_Pictographics
জানুয়ারী

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

3

এই কোডটি নিয়ে আমার কোনও সমস্যা হয়নি:

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

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

        if (exactPath)
        {
            string root = Path.GetPathRoot(path);
            isValid = string.IsNullOrEmpty(root.Trim(new char[] { '\\', '/' })) == false;
        }
        else
        {
            isValid = Path.IsPathRooted(path);
        }
    }
    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");
IsValidPath("abc");
IsValidPath("abc", false);

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

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", false);

3

একটি সহজ ওএস-স্বাধীন সমাধান:

এগিয়ে যান এবং প্রকৃত ডিরেক্টরি তৈরি করার চেষ্টা করুন; যদি কোনও সমস্যা থাকে বা নামটি অবৈধ হয় তবে ওএস স্বয়ংক্রিয়ভাবে অভিযোগ করবে এবং কোডটি নিক্ষেপ করবে।

public static class PathHelper
{
    public static void ValidatePath(string path)
    {
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path).Delete();
    }
}

ব্যবহার:

try
{
    PathHelper.ValidatePath(path);
}
catch(Exception e)
{
    // handle exception
}

Directory.CreateDirectory() নিম্নলিখিত সমস্ত পরিস্থিতিতে স্বয়ংক্রিয়ভাবে নিক্ষেপ করবে:

System.IO.IOException:
পাথ দ্বারা নির্দিষ্ট ডিরেক্টরিটি একটি ফাইল। -অর- নেটওয়ার্কের নাম জানা যায়নি।

System.AnuthorisedAccessException:
কলারের প্রয়োজনীয় অনুমতি নেই।

সিস্টেম.আর্গগমেন্টএক্সেপশন:
পাথটি শূন্য দৈর্ঘ্যের স্ট্রিং, এতে কেবল সাদা স্থান থাকে বা এক বা একাধিক অবৈধ অক্ষর থাকে। আপনি System.IO.Path.GetInuthorPathChars পদ্ধতি ব্যবহার করে অবৈধ অক্ষরের জন্য অনুসন্ধান করতে পারেন। -অর-পাথটি কেবল একটি কোলন চরিত্র (:) এর সাথে উপসর্গযুক্ত হয় বা থাকে।

সিস্টেম.আরগমেন্ট
নাল এক্সসেপশন: পথটি শূন্য।

System.IO.PathTooLongException:
নির্দিষ্ট পথ, ফাইলের নাম বা উভয়ই সিস্টেম-সংজ্ঞায়িত সর্বাধিক দৈর্ঘ্যের চেয়ে বেশি।

System.IO.DirectoryNotFoundException:
নির্দিষ্ট পথটি অবৈধ (উদাহরণস্বরূপ, এটি একটি আনম্যাপড ড্রাইভে রয়েছে)।

System.NotSupporterException: পাথটিতে
একটি কোলন চরিত্র রয়েছে (:) এটি কোনও ড্রাইভ লেবেলের অংশ নয় ("সি:")।

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