কোনও পথ কোনও ফাইল বা ডিরেক্টরি কিনা তা যাচাই করার আরও ভাল উপায়?


382

আমি TreeViewডিরেক্টরি এবং ফাইল একটি প্রক্রিয়া করছি । কোনও ব্যবহারকারী কোনও ফাইল বা ডিরেক্টরি নির্বাচন করতে পারেন এবং তারপরে এটি দিয়ে কিছু করতে পারেন। এর জন্য আমার একটি পদ্ধতি থাকা দরকার যা ব্যবহারকারীর নির্বাচনের ভিত্তিতে বিভিন্ন ক্রিয়া সম্পাদন করে।

এই মুহুর্তে আমি পথটি কোনও ফাইল বা ডিরেক্টরি কিনা তা নির্ধারণ করতে এই জাতীয় কিছু করছি:

bool bIsFile = false;
bool bIsDirectory = false;

try
{
    string[] subfolders = Directory.GetDirectories(strFilePath);

    bIsDirectory = true;
    bIsFile = false;
}
catch(System.IO.IOException)
{
    bIsFolder = false;
    bIsFile = true;
}

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


8
কেউ "বিদ্যমান" ফাইল / ডিরেক্টরি নির্দিষ্ট করতে প্রশ্নের শিরোনাম সম্পাদনা করতে পারবেন ? উত্তরগুলির সমস্তই ডিস্কে থাকা কোনও ফাইল / ডিরেক্টরিতে একটি পাথের জন্য প্রযোজ্য।
জ্যাক বার্গার

1
@ জবার্গার দয়া করে নীচে আমার উত্তর দেখুন। আমি ফাইল / ফোল্ডারগুলির পাথের জন্য এটি সম্পাদন করার একটি উপায় খুঁজে পেয়েছি যা থাকতে পারে বা নাও থাকতে পারে।
lhan


আপনি এই ট্রিভিউকে কীভাবে পপুলেশন করছেন? আপনি কীভাবে এটার পথ পাচ্ছেন?
র্যান্ডম 832

উত্তর:


594

থেকে কিভাবে যদি পথ ফাইল অথবা ডাইরেক্টরি হয় বলতে :

// get the file attributes for file or directory
FileAttributes attr = File.GetAttributes(@"c:\Temp");

//detect whether its a directory or file
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
    MessageBox.Show("Its a directory");
else
    MessageBox.Show("Its a file");

.NET 4.0+ এর জন্য আপডেট

নীচের মন্তব্যগুলি অনুসারে, আপনি .NET 4.0 বা তারপরে থাকলে (এবং সর্বাধিক পারফরম্যান্স সমালোচনাযোগ্য নয়) আপনি একটি ক্লিনার উপায়ে কোডটি লিখতে পারেন:

// get the file attributes for file or directory
FileAttributes attr = File.GetAttributes(@"c:\Temp");

if (attr.HasFlag(FileAttributes.Directory))
    MessageBox.Show("Its a directory");
else
    MessageBox.Show("Its a file");

8
+1 এটি আরও ভাল পদ্ধতির এবং আমি প্রস্তাবিত সমাধানের চেয়ে উল্লেখযোগ্যভাবে দ্রুত।
অ্যান্ড্রু হার 18

6
@ কীএমএস ৯২ এটির বিটওয়াইজ গণিত। মূলত, অ্যাটর হ'ল কিছু বাইনারি মান যার একটি বিট অর্থ "এটি একটি ডিরেক্টরি" meaning বিটওয়াইস এবং &অপারেটর একটি বাইনারি মান প্রদান করবে যেখানে উভয় অপারেশনে কেবল (1) বিট চালু আছে। এই ক্ষেত্রে বিরুদ্ধে একটি bitwise এবং অপারেশন করছেন attrএবং FileAttributes.Directoryমান মান ফিরে আসবে FileAttributes.Directoryযদি নির্দেশিকা ফাইল অ্যাট্রিবিউট বিট চালু আছে। আরও ভাল ব্যাখ্যার জন্য en.wikedia.org/wiki/Bitwise_operation দেখুন _
কাইল ট্রুবারম্যান

6
@ জবার্গার যদি পথটির অস্তিত্ব না থাকে তবে এটি C:\Tempডাইরেক্টরি Tempবা ডাকা একটি ফাইলকে বোঝায় কিনা তা অস্পষ্ট Temp। কোড বলতে কি বোঝায়?
ta.speot.is

26
@ কী: .NET 4.0 এর পরে, attr.HasFlag(FileAttributes.Directory)পরিবর্তে ব্যবহার করা যেতে পারে।
akafak Gür

13
@ AkafakGür: সময় সংবেদনশীল লুপের মধ্যে এটি করবেন না। অ্যাশ.হ্যাসফ্ল্যাগ () নরক হিসাবে ধীর এবং প্রতিটি কলের জন্য প্রতিবিম্ব ব্যবহার করে
বসন্তকালীন

247

এগুলি ব্যবহার সম্পর্কে কীভাবে?

File.Exists();
Directory.Exists();

43
এটির বিপরীতে একটি অবৈধ পথে কোনও ব্যতিক্রম না ছোঁড়ার সুবিধাও রয়েছে File.GetAttributes()
Deanna

আমি আমার প্রকল্পে বিসিএল বিসিএল কোডপ্লেক্স.কমের লং পাথ লাইব্রেরিটি ব্যবহার করি যাতে ফাইল বৈশিষ্ট্য পাওয়ার কোনও উপায় নেই তবে অ্যাসিস্টকে কল করা খুব ভাল কাজ নয়।
পুটার্ডো বোরাটো

4
@ জবার্গার আমি আশা করব এটি অস্তিত্বহীন ফাইল / ফোল্ডারগুলির পথে কাজ করবে না। ফাইল.এক্সজিস্ট ("সি: \\ টেম্প \\ অজানা। টেক্সট") এর মতো মিথ্যাও ফিরিয়ে দেওয়া উচিত।
মাইকেলকোস

12
আপনি যদি অস্তিত্বহীন ফাইল / ফোল্ডারগুলি সম্পর্কে উদ্বিগ্ন হন তবে এটি চেষ্টা করে দেখুন public static bool? IsDirectory(string path){ if (Directory.Exists(path)) return true; // is a directory else if (File.Exists(path)) return false; // is a file else return null; // is a nothing }
ডাস্টিন টাউনসেন্ড

1
এ সম্পর্কে আরও বিশদটি এমএসডিএন.মাইক্রোসফটকম
মোজি

20

কোনও পাথ ডিরেক্টরি বা ফাইল হলে কেবল এই লাইনটি দিয়ে আপনি পেতে পারেন:

File.GetAttributes(data.Path).HasFlag(FileAttributes.Directory)

4
মনে মনে আপনার এ জন্য কমপক্ষে নেট নেট দরকার need এছাড়াও পথটি কোনও বৈধ পথ না হলে এটি বিস্ফোরিত হবে।
নওফাল

পথটি বিদ্যমান কিনা তা পরীক্ষা করতে একটি ফাইলআইএনফো অবজেক্ট ব্যবহার করুন: ফাইলআইএনফো পিফিনফো = নতুন ফাইলআইএনফো (এফএলিস্ট [0]); if (pFinfo.Exists) {if (File.GetAttributes (FList [0])। hasFlag (FileAttributes.Directory)) {}}। এই আমার জন্য কাজ করে।
মাইকেল সিলিমসন

আপনি যদি ইতিমধ্যে একটি ফাইলআইফোন অবজেক্ট তৈরি করেছেন এবং উদাহরণের অস্তিত্বের সম্পত্তিটি ব্যবহার করছেন তবে স্থির ফাইল.গেটঅ্যাট্রিবিউটস () পদ্ধতিটি ব্যবহার না করে এর বৈশিষ্ট্যগুলিতে কেন অ্যাক্সেস করবেন না?
ডায়নামিকেল

10

এখানে আমার:

    bool IsPathDirectory(string path)
    {
        if (path == null) throw new ArgumentNullException("path");
        path = path.Trim();

        if (Directory.Exists(path)) 
            return true;

        if (File.Exists(path)) 
            return false;

        // neither file nor directory exists. guess intention

        // if has trailing slash then it's a directory
        if (new[] {"\\", "/"}.Any(x => path.EndsWith(x)))
            return true; // ends with slash

        // if has extension then its a file; directory otherwise
        return string.IsNullOrWhiteSpace(Path.GetExtension(path));
    }

এটি অন্যের উত্তরের মতো তবে ঠিক একই নয়।


3
প্রযুক্তিগতভাবে আপনার ব্যবহার করা উচিত Path.DirectorySeparatorCharএবংPath.AltDirectorySeparatorChar
ড্রজাস

1
উদ্দেশ্যটি অনুমান করার এই ধারণাটি আকর্ষণীয়। আইএমএইচও দুটি পদ্ধতিতে বিভক্ত করা আরও ভাল। পদ্ধতি এক অস্তিত্ব পরীক্ষা করে, একটি বর্ধিত বুলিয়ান ফিরে দেয়। যদি কলকারী তার পরে "অনুমান" অংশটি চায় তবে ওয়ান থেকে শূন্য ফলাফল হতে পারে, তারপরে মেথড টু কল করুন যা অনুমান করে।
টুলমেকারস্টেভ

2
আমি এটি পুনরায় লিখতে চাইলে এটি অনুমান করা হয়েছিল কি না তা দিয়ে একটি টিপল ফেরত দিতে।
রনি ওভারবি

1
"যদি এক্সটেনশন থাকে তবে এটির একটি ফাইল" - এটি সত্য নয়। একটি ফাইলের একটি এক্সটেনশন (উইন্ডোতেও) থাকতে হবে না এবং ডিরেক্টরিতে একটি "এক্সটেনশন" থাকতে পারে। উদাহরণস্বরূপ এটি কোনও ফাইল বা ডিরেক্টরি হতে পারে: "সি: \ নতুন ফোল্ডার.লগ"
বাইটেডেভ

2
@ বটেডেভ আমি জানি যে, তবে ফাংশনের সেই মুহুর্তে কোডটি উদ্দেশ্য অনুমান করছে। এমনকি একটি মন্তব্য এমনকি বলছে। বেশিরভাগ ফাইলের একটি এক্সটেনশন থাকে। বেশিরভাগ ডিরেক্টরি না।
রনি ওভারবি

7

ডিরেক্টরি.এক্সিস্টগুলির বিকল্প হিসাবে (), আপনি কোনও ফাইল বা ডিরেক্টরিগুলির বৈশিষ্ট্য পেতে ফাইল.গ্যাটঅ্যাট্রিবিউটস () পদ্ধতিটি ব্যবহার করতে পারেন, আপনি এই জাতীয় সাহায্যকারী পদ্ধতি তৈরি করতে পারেন:

private static bool IsDirectory(string path)
{
    System.IO.FileAttributes fa = System.IO.File.GetAttributes(path);
    return (fa & FileAttributes.Directory) != 0;
}

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



6
যুক্তির এই ভয়ঙ্কর ব্লকের পরিবর্তে চেষ্টা করুনisDirectory = (fa & FileAttributes.Directory) != 0);
অমর ব্লু

5

বিদ্যমান এবং বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যগুলির আচরণের কারণে এটিই আমি সেরাভাবে আসতে পারি:

using System.IO;

public static class FileSystemInfoExtensions
{
    /// <summary>
    /// Checks whether a FileInfo or DirectoryInfo object is a directory, or intended to be a directory.
    /// </summary>
    /// <param name="fileSystemInfo"></param>
    /// <returns></returns>
    public static bool IsDirectory(this FileSystemInfo fileSystemInfo)
    {
        if (fileSystemInfo == null)
        {
            return false;
        }

        if ((int)fileSystemInfo.Attributes != -1)
        {
            // if attributes are initialized check the directory flag
            return fileSystemInfo.Attributes.HasFlag(FileAttributes.Directory);
        }

        // If we get here the file probably doesn't exist yet.  The best we can do is 
        // try to judge intent.  Because directories can have extensions and files
        // can lack them, we can't rely on filename.
        // 
        // We can reasonably assume that if the path doesn't exist yet and 
        // FileSystemInfo is a DirectoryInfo, a directory is intended.  FileInfo can 
        // make a directory, but it would be a bizarre code path.

        return fileSystemInfo is DirectoryInfo;
    }
}

এটি এখানে কীভাবে পরীক্ষা করে দেখেছে:

    [TestMethod]
    public void IsDirectoryTest()
    {
        // non-existing file, FileAttributes not conclusive, rely on type of FileSystemInfo
        const string nonExistentFile = @"C:\TotallyFakeFile.exe";

        var nonExistentFileDirectoryInfo = new DirectoryInfo(nonExistentFile);
        Assert.IsTrue(nonExistentFileDirectoryInfo.IsDirectory());

        var nonExistentFileFileInfo = new FileInfo(nonExistentFile);
        Assert.IsFalse(nonExistentFileFileInfo.IsDirectory());

        // non-existing directory, FileAttributes not conclusive, rely on type of FileSystemInfo
        const string nonExistentDirectory = @"C:\FakeDirectory";

        var nonExistentDirectoryInfo = new DirectoryInfo(nonExistentDirectory);
        Assert.IsTrue(nonExistentDirectoryInfo.IsDirectory());

        var nonExistentFileInfo = new FileInfo(nonExistentDirectory);
        Assert.IsFalse(nonExistentFileInfo.IsDirectory());

        // Existing, rely on FileAttributes
        const string existingDirectory = @"C:\Windows";

        var existingDirectoryInfo = new DirectoryInfo(existingDirectory);
        Assert.IsTrue(existingDirectoryInfo.IsDirectory());

        var existingDirectoryFileInfo = new FileInfo(existingDirectory);
        Assert.IsTrue(existingDirectoryFileInfo.IsDirectory());

        // Existing, rely on FileAttributes
        const string existingFile = @"C:\Windows\notepad.exe";

        var existingFileDirectoryInfo = new DirectoryInfo(existingFile);
        Assert.IsFalse(existingFileDirectoryInfo.IsDirectory());

        var existingFileFileInfo = new FileInfo(existingFile);
        Assert.IsFalse(existingFileFileInfo.IsDirectory());
    }

5

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

  1. ফোল্ডারগুলির "এক্সটেনশন" থাকতে পারে: C:\Temp\folder_with.dot
  2. ডিরেক্টরিগুলি পৃথককারী (স্ল্যাশ) দিয়ে ফাইলগুলি শেষ হতে পারে না
  3. প্রযুক্তিগতভাবে দুটি ডিরেক্টরি বিভাজক রয়েছে যা প্ল্যাটফর্ম নির্দিষ্ট - যেমন স্ল্যাশ হতে পারে বা নাও হতে পারে ( Path.DirectorySeparatorCharএবং Path.AltDirectorySeparatorChar)

পরীক্ষা (লিনকপ্যাড)

var paths = new[] {
    // exists
    @"C:\Temp\dir_test\folder_is_a_dir",
    @"C:\Temp\dir_test\is_a_dir_trailing_slash\",
    @"C:\Temp\dir_test\existing_folder_with.ext",
    @"C:\Temp\dir_test\file_thats_not_a_dir",
    @"C:\Temp\dir_test\notadir.txt",
    // doesn't exist
    @"C:\Temp\dir_test\dne_folder_is_a_dir",
    @"C:\Temp\dir_test\dne_folder_trailing_slash\",
    @"C:\Temp\dir_test\non_existing_folder_with.ext",
    @"C:\Temp\dir_test\dne_file_thats_not_a_dir",
    @"C:\Temp\dir_test\dne_notadir.txt",        
};

foreach(var path in paths) {
    IsFolder(path/*, false*/).Dump(path);
}

ফলাফল

C:\Temp\dir_test\folder_is_a_dir
  True 
C:\Temp\dir_test\is_a_dir_trailing_slash\
  True 
C:\Temp\dir_test\existing_folder_with.ext
  True 
C:\Temp\dir_test\file_thats_not_a_dir
  False 
C:\Temp\dir_test\notadir.txt
  False 
C:\Temp\dir_test\dne_folder_is_a_dir
  True 
C:\Temp\dir_test\dne_folder_trailing_slash\
  True 
C:\Temp\dir_test\non_existing_folder_with.ext
  False (this is the weird one)
C:\Temp\dir_test\dne_file_thats_not_a_dir
  True 
C:\Temp\dir_test\dne_notadir.txt
  False 

পদ্ধতি

/// <summary>
/// Whether the <paramref name="path"/> is a folder (existing or not); 
/// optionally assume that if it doesn't "look like" a file then it's a directory.
/// </summary>
/// <param name="path">Path to check</param>
/// <param name="assumeDneLookAlike">If the <paramref name="path"/> doesn't exist, does it at least look like a directory name?  As in, it doesn't look like a file.</param>
/// <returns><c>True</c> if a folder/directory, <c>false</c> if not.</returns>
public static bool IsFolder(string path, bool assumeDneLookAlike = true)
{
    // /programming/1395205/better-way-to-check-if-path-is-a-file-or-a-directory
    // turns out to be about the same as https://stackoverflow.com/a/19596821/1037948

    // check in order of verisimilitude

    // exists or ends with a directory separator -- files cannot end with directory separator, right?
    if (Directory.Exists(path)
        // use system values rather than assume slashes
        || path.EndsWith("" + Path.DirectorySeparatorChar)
        || path.EndsWith("" + Path.AltDirectorySeparatorChar))
        return true;

    // if we know for sure that it's an actual file...
    if (File.Exists(path))
        return false;

    // if it has an extension it should be a file, so vice versa
    // although technically directories can have extensions...
    if (!Path.HasExtension(path) && assumeDneLookAlike)
        return true;

    // only works for existing files, kinda redundant with `.Exists` above
    //if( File.GetAttributes(path).HasFlag(FileAttributes.Directory) ) ...; 

    // no idea -- could return an 'indeterminate' value (nullable bool)
    // or assume that if we don't know then it's not a folder
    return false;
}

Path.DirectorySeparatorChar.ToString()পরিবর্তে স্ট্রিং কনক্যাট সঙ্গে ""?
কোডিং হয়ে গেছে

@ গনকোডিং সম্ভবত; সেই সময় আমি একগুচ্ছ নালামাল সম্পত্তি নিয়ে কাজ করছিলাম তাই নাল পরীক্ষা করার চিন্তা করার চেয়ে আমি "খালি স্ট্রিং সহ কনক্যাট" অভ্যাস পেয়েছিলাম। আপনি যদি সত্যিই অপ্টিমাইজড হতে চান তবে আপনি new String(Path.DirectorySeparatorChar, 1)যা করতে পারেন তাও করতে ToStringপারেন ।
ড্রাগজা

4

সবচেয়ে সঠিক পন্থা shlwapi.dll থেকে কিছু ইন্টারপ কোড ব্যবহার করা হতে চলেছে

[DllImport(SHLWAPI, CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
[ResourceExposure(ResourceScope.None)]
internal static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

আপনি তখন এটিকে এভাবে ডাকবেন:

#region IsDirectory
/// <summary>
/// Verifies that a path is a valid directory.
/// </summary>
/// <param name="path">The path to verify.</param>
/// <returns><see langword="true"/> if the path is a valid directory; 
/// otherwise, <see langword="false"/>.</returns>
/// <exception cref="T:System.ArgumentNullException">
/// <para><paramref name="path"/> is <see langword="null"/>.</para>
/// </exception>
/// <exception cref="T:System.ArgumentException">
/// <para><paramref name="path"/> is <see cref="F:System.String.Empty">String.Empty</see>.</para>
/// </exception>
public static bool IsDirectory(string path)
{
    return PathIsDirectory(path);
}

31
কুশ্রী। আমি এই সাধারণ কাজগুলি করতে ইন্টারপকে ঘৃণা করি। এবং এটি বহনযোগ্য নয়। এবং এটি কুরুচিপূর্ণ। আমি কি বলেছিলাম যে এটি কুৎসিত? :)
ইগনাসিও সোলার গার্সিয়া

5
@ সোমোস এটি আপনার মতে "কুরুচিপূর্ণ" হতে পারে তবে এটি এখনও সবচেয়ে সঠিক পন্থা। হ্যাঁ, এটি কোনও বহনযোগ্য সমাধান নয় তবে এটি প্রশ্নটি জিজ্ঞাসা করেছিল।
স্কট ডোরম্যান

8
সঠিক বলতে কী বোঝ? এটি কুইন উইলসনের কাছ থেকে উত্তর হিসাবে একই ফলাফল দেয় এবং প্রয়োজনীয় ইন্টারওপ যা বহনযোগ্যতা ভঙ্গ করে। আমার কাছে এটি অন্যান্য সমাধানগুলির মতোই নির্ভুল এবং এর পার্শ্ব প্রতিক্রিয়া রয়েছে যা অন্যরা করে না।
ইগনাসিও সোলার গার্সিয়া

7
এটি করার জন্য একটি ফ্রেমওয়ার্ক এপিআই রয়েছে। ইন্টারপ ব্যবহার করা কোনও উপায় নয়।
TomXP411

5
হ্যাঁ এটি কাজ করে তবে এটি "সর্বাধিক নির্ভুল" সমাধান নয় - বিদ্যমান। নেট ফ্রেমওয়ার্কটি ব্যবহার করা ছাড়া আর কিছুই নয়। পরিবর্তে, .NET ফ্রেমওয়ার্কের সাহায্যে এক লাইনে কী করা যায় তা প্রতিস্থাপন করতে আপনি 6 টি লাইন কোড গ্রহণ করেন এবং মনো প্রকল্পের সাথে এটি পোর্ট করার ক্ষমতা উন্মুক্ত রেখে যাওয়ার বিপরীতে কেবলমাত্র উইন্ডোজ ব্যবহারে নিজেকে লক করেন। .NET ফ্রেমওয়ার্ক আরও মার্জিত সমাধানের প্রস্তাব দিলে কখনও ইন্টারপ ব্যবহার করবেন না।
রুশ

2

আমরা যা ব্যবহার করি তা এখানে:

using System;

using System.IO;

namespace crmachine.CommonClasses
{

  public static class CRMPath
  {

    public static bool IsDirectory(string path)
    {
      if (path == null)
      {
        throw new ArgumentNullException("path");
      }

      string reason;
      if (!IsValidPathString(path, out reason))
      {
        throw new ArgumentException(reason);
      }

      if (!(Directory.Exists(path) || File.Exists(path)))
      {
        throw new InvalidOperationException(string.Format("Could not find a part of the path '{0}'",path));
      }

      return (new System.IO.FileInfo(path).Attributes & FileAttributes.Directory) == FileAttributes.Directory;
    } 

    public static bool IsValidPathString(string pathStringToTest, out string reasonForError)
    {
      reasonForError = "";
      if (string.IsNullOrWhiteSpace(pathStringToTest))
      {
        reasonForError = "Path is Null or Whitespace.";
        return false;
      }
      if (pathStringToTest.Length > CRMConst.MAXPATH) // MAXPATH == 260
      {
        reasonForError = "Length of path exceeds MAXPATH.";
        return false;
      }
      if (PathContainsInvalidCharacters(pathStringToTest))
      {
        reasonForError = "Path contains invalid path characters.";
        return false;
      }
      if (pathStringToTest == ":")
      {
        reasonForError = "Path consists of only a volume designator.";
        return false;
      }
      if (pathStringToTest[0] == ':')
      {
        reasonForError = "Path begins with a volume designator.";
        return false;
      }

      if (pathStringToTest.Contains(":") && pathStringToTest.IndexOf(':') != 1)
      {
        reasonForError = "Path contains a volume designator that is not part of a drive label.";
        return false;
      }
      return true;
    }

    public static bool PathContainsInvalidCharacters(string path)
    {
      if (path == null)
      {
        throw new ArgumentNullException("path");
      }

      bool containedInvalidCharacters = false;

      for (int i = 0; i < path.Length; i++)
      {
        int n = path[i];
        if (
            (n == 0x22) || // "
            (n == 0x3c) || // <
            (n == 0x3e) || // >
            (n == 0x7c) || // |
            (n  < 0x20)    // the control characters
          )
        {
          containedInvalidCharacters = true;
        }
      }

      return containedInvalidCharacters;
    }


    public static bool FilenameContainsInvalidCharacters(string filename)
    {
      if (filename == null)
      {
        throw new ArgumentNullException("filename");
      }

      bool containedInvalidCharacters = false;

      for (int i = 0; i < filename.Length; i++)
      {
        int n = filename[i];
        if (
            (n == 0x22) || // "
            (n == 0x3c) || // <
            (n == 0x3e) || // >
            (n == 0x7c) || // |
            (n == 0x3a) || // : 
            (n == 0x2a) || // * 
            (n == 0x3f) || // ? 
            (n == 0x5c) || // \ 
            (n == 0x2f) || // /
            (n  < 0x20)    // the control characters
          )
        {
          containedInvalidCharacters = true;
        }
      }

      return containedInvalidCharacters;
    }

  }

}

2

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

Dim path As String = "myFakeFolder\ThisDoesNotExist\"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns True

Dim path As String = "myFakeFolder\ThisDoesNotExist\File.jpg"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns False

আশা করি এটি কারও পক্ষে সহায়ক হতে পারে!


1
আপনি কি পথটি ব্যবহার করেছেন? হাস এক্সটেনশন পদ্ধতি?
জ্যাক বার্গার

যদি এটি বিদ্যমান না থাকে, তবে এটি কোনও ফাইল বা ডিরেক্টরি নয়। যে কোনও নাম তৈরি করা যায়। যদি আপনি এটি তৈরি করতে চান, তবে আপনি কী তৈরি করছেন তা আপনার জানা উচিত , এবং যদি আপনি না করেন তবে কেন সম্ভবত আপনার এই তথ্যের প্রয়োজন হতে পারে?
র্যান্ডম 832

8
একটি ফোল্ডার নাম দেওয়া যেতে পারে test.txtএবং একটি ফাইলের নাম দেওয়া যেতে পারে test- এই ক্ষেত্রে আপনার কোডটি ভুল ফলাফল ফিরিয়ে আনতে পারে
স্টেফান বাউর

2
System.IO.FIle এবং System.IO.Directory ক্লাসে একটি .Exists পদ্ধতি রয়েছে E এটা করার জিনিস। ডিরেক্টরিগুলিতে এক্সটেনশন থাকতে পারে; আমি ঘন ঘন এটি দেখতে।
TomXP411

2

আমি জানি গেমের দেরিতে খুব দেরি হয়ে গেছে, তবে ভেবেছিলাম আমি যেভাবেই এটি ভাগ করে নেব। আপনি যদি পুরোপুরি স্ট্রিং হিসাবে কাজ করে থাকেন তবে এটি নির্ধারণ করা পাই হিসাবে সহজ:

private bool IsFolder(string ThePath)
{
    string BS = Path.DirectorySeparatorChar.ToString();
    return Path.GetDirectoryName(ThePath) == ThePath.TrimEnd(BS.ToCharArray());
}

উদাহরণস্বরূপ: ThePath == "C:\SomeFolder\File1.txt"এটি হ'ল শেষ হবে:

return "C:\SomeFolder" == "C:\SomeFolder\File1.txt" (FALSE)

অন্য একটি উদাহরণ: ThePath == "C:\SomeFolder\"এটি হ'ল শেষ হবে:

return "C:\SomeFolder" == "C:\SomeFolder" (TRUE)

এবং এটি পিছনে ব্যাকস্ল্যাশ ছাড়াই কাজ ThePath == "C:\SomeFolder"করবে : এটি হ'ল এটি হবে:

return "C:\SomeFolder" == "C:\SomeFolder" (TRUE)

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


2
System.IO.FileSystemWatcherযখন কোনও ডিরেক্টরি মুছে ফেলা হয় তখন এটি কাজ করে না যখন এটি c:\my_directoryকোনও যুক্তি হিসাবে প্রেরণ করে যখন কোনও এক্সটেনশান কম ফাইল c:\my_directoryমোছা হয়।
রায় চেং

GetDirectoryName('C:\SomeFolder')ফিরে আসে 'C:\', যাতে আপনার শেষ কেস কাজ করে না। এটি কোনও এক্সটেনশন ছাড়াই ডিরেক্টরি এবং ফাইলগুলির মধ্যে পার্থক্য করে না।
লুসি

আপনি ভ্রান্তভাবে ধরে নিয়েছেন যে একটি ডিরেক্টরি পথ সর্বদা চূড়ান্ত "\" অন্তর্ভুক্ত করবে। উদাহরণস্বরূপ, Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")ফিরে আসবে C:\SomeFolder। লক্ষ্য করুন যে গেটডাইরেক্টরিনেম কী রিটার্ন দেয় তার নিজস্ব উদাহরণগুলি দেখায় যে এটি একটি এমন পথ ফেরায় যা ব্যাকস্ল্যাশে শেষ হয় না । এর অর্থ যদি কেউ ডিরেক্টরি পথ পেতে অন্য কোথাও getDirectoryName ব্যবহার করে এবং আপনার পদ্ধতিতে এটি ফিড করে তবে তারা ভুল উত্তর পাবে।
টুলমেকারস্টেভ

1

"লুকানো" এবং "সিস্টেম" চিহ্নিত চিহ্নিতগুলি সহ আপনি যদি ডিরেক্টরিগুলি সন্ধান করতে চান তবে এটি চেষ্টা করে দেখুন (.NET V4 প্রয়োজন):

FileAttributes fa = File.GetAttributes(path);
if(fa.HasFlag(FileAttributes.Directory)) 

1

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

if (!Directory.Exists(@"C:\folderName")) return;

0

আমি নিম্নলিখিতটি ব্যবহার করি, এটি এক্সটেনশনেরও পরীক্ষা করে যার অর্থ এটি যদি পরীক্ষার জন্য ব্যবহার করা যেতে পারে তবে সরবরাহ করা পথটি একটি ফাইল তবে একটি ফাইল নেই।

private static bool isDirectory(string path)
{
    bool result = true;
    System.IO.FileInfo fileTest = new System.IO.FileInfo(path);
    if (fileTest.Exists == true)
    {
        result = false;
    }
    else
    {
        if (fileTest.Extension != "")
        {
            result = false;
        }
    }
    return result;
}

1
ফাইল-ইনফো এক্সটেনশন হ'ল (আইএমএও) অস্তিত্বহীন পাথগুলি পরীক্ষা করার জন্য একটি ভাল বিকল্প
ডেটা কোর

2
আপনার দ্বিতীয় অবস্থা (অন্যথায়) দুর্গন্ধযুক্ত। যদি এটি কোনও বিদ্যমান ফাইল না হয় তবে আপনি সম্ভবত এটি কী হতে পারে তা জানেন না (ডিরেক্টরিগুলি ".txt" এর মতোও শেষ হতে পারে)।
নওফাল

0
using System;
using System.IO;
namespace FileOrDirectory
{
     class Program
     {
          public static string FileOrDirectory(string path)
          {
               if (File.Exists(path))
                    return "File";
               if (Directory.Exists(path))
                    return "Directory";
               return "Path Not Exists";
          }
          static void Main()
          {
               Console.WriteLine("Enter The Path:");
               string path = Console.ReadLine();
               Console.WriteLine(FileOrDirectory(path));
          }
     }
}

0

এই পোস্টে নির্বাচিত উত্তরটি ব্যবহার করে, আমি মন্তব্যগুলির দিকে নজর রেখেছি এবং @ ŞafakGür, @ অ্যান্থনি এবং @ কুইন উইলসনকে তাদের তথ্যের বিটের জন্য যা আমি লিখেছিলাম এবং পরীক্ষিত করেছি এই উন্নত উত্তরের দিকে নিয়ে যায়:

    /// <summary>
    /// Returns true if the path is a dir, false if it's a file and null if it's neither or doesn't exist.
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    public static bool? IsDirFile(this string path)
    {
        bool? result = null;

        if(Directory.Exists(path) || File.Exists(path))
        {
            // get the file attributes for file or directory
            var fileAttr = File.GetAttributes(path);

            if (fileAttr.HasFlag(FileAttributes.Directory))
                result = true;
            else
                result = false;
        }

        return result;
    }

ইতিমধ্যে ডিরেক্টরি / ফাইল অস্তিত্ব () এর জন্য যাচাই করার পরে বৈশিষ্ট্যগুলি পরীক্ষা করতে কিছুটা অপ্রয়োজনীয় মনে হচ্ছে? এই দুটি কল একা এখানে প্রয়োজনীয় সমস্ত কাজ করে।
কোডিং হয়ে গেছে

0

হতে পারে ইউডাব্লুপি সি # এর জন্য

public static async Task<IStorageItem> AsIStorageItemAsync(this string iStorageItemPath)
    {
        if (string.IsNullOrEmpty(iStorageItemPath)) return null;
        IStorageItem storageItem = null;
        try
        {
            storageItem = await StorageFolder.GetFolderFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        try
        {
            storageItem = await StorageFile.GetFileFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        return storageItem;
    }

0

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

আমার ক্ষেত্রে

var isFileName = System.IO.Path.GetFileName (str) == str;

কৌতুকটি করেছে ঠিক আছে, এটি যাদু নয়, তবে সম্ভবত এটি কাউকে কয়েক মিনিটের সন্ধান করতে পারে। যেহেতু এটি কেবল একটি স্ট্রিং-পার্সিং, তাই বিন্দু সহ দির-নামগুলি মিথ্যা ধনাত্মকতা দিতে পারে ...


0

পার্টি এখানে অত্যন্ত দেরী কিন্তু আমি পেয়েছি Nullable<Boolean>ফেরত মান বেশ কুশ্রী হতে - IsDirectory(string path)রিটার্নিং null, মন্তব্য বাগাড়ম্বরপূর্ণ ছাড়া একটি অবর্তমান পথ সমার্থক নয় তাই আমি নিম্নলিখিত সঙ্গে আসা পর্যন্ত করেছি:

public static class PathHelper
{
    /// <summary>
    /// Determines whether the given path refers to an existing file or directory on disk.
    /// </summary>
    /// <param name="path">The path to test.</param>
    /// <param name="isDirectory">When this method returns, contains true if the path was found to be an existing directory, false in all other scenarios.</param>
    /// <returns>true if the path exists; otherwise, false.</returns>
    /// <exception cref="ArgumentNullException">If <paramref name="path"/> is null.</exception>
    /// <exception cref="ArgumentException">If <paramref name="path"/> equals <see cref="string.Empty"/></exception>
    public static bool PathExists(string path, out bool isDirectory)
    {
        if (path == null) throw new ArgumentNullException(nameof(path));
        if (path == string.Empty) throw new ArgumentException("Value cannot be empty.", nameof(path));

        isDirectory = Directory.Exists(path);

        return isDirectory || File.Exists(path);
    }
}

এই সহায়ক পদ্ধতিটি প্রথমবার পড়ার উদ্দেশ্যটি বোঝার জন্য ভার্বোজ এবং যথেষ্ট সংক্ষিপ্ত হিসাবে লেখা।

/// <summary>
/// Example usage of <see cref="PathExists(string, out bool)"/>
/// </summary>
public static void Usage()
{
    const string path = @"C:\dev";

    if (!PathHelper.PathExists(path, out var isDirectory))
        return;

    if (isDirectory)
    {
        // Do something with your directory
    }
    else
    {
        // Do something with your file
    }
}

-4

এই কাজ করবে না?

var isFile = Regex.IsMatch(path, @"\w{1,}\.\w{1,}$");

1
এটি কেবলমাত্র কার্যকর হবে না কারণ ফোল্ডারের নামগুলির মধ্যে পিরিয়ড থাকতে পারে
কেএসআইবি

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