[c#] यह जांचने का बेहतर तरीका है कि कोई पथ फ़ाइल या निर्देशिका है या नहीं?


Answers

इनका उपयोग करने के बारे में कैसे?

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

मैं निर्देशिकाओं और फ़ाइलों के 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;
}

मैं यह महसूस करने में मदद नहीं कर सकता कि ऐसा करने का एक बेहतर तरीका है! मैं इसे संभालने के लिए एक मानक .NET विधि खोजने की उम्मीद कर रहा था, लेकिन मैं ऐसा करने में सक्षम नहीं हूं। क्या ऐसी विधि मौजूद है, और यदि नहीं, तो यह निर्धारित करने के लिए सबसे सरल माध्यम क्या है कि पथ एक फ़ाइल या निर्देशिका है या नहीं?




इस पोस्ट पर चयनित उत्तर का उपयोग करके, मैंने टिप्पणियों को देखा और @ Ş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;
    }



यह विशेषता प्राप्त करने के लिए DirectoryInfo का उपयोग कर रहा है

Dim newnode As TreeNode
Dim dirs As New DirectoryInfo(node.FullPath)
For Each dir As DirectoryInfo In dirs.GetDirectories()
    If dir.Attributes = FileAttributes.Directory Then

    Else

    End If
Next

यदि आप TreeView बनाने या TreeView को पढ़ने का प्रयास करने के लिए DirectoryInfo से प्राप्त करने का प्रयास कर रहे हैं तो यह काम करेगा




मुझे पता है कि खेल में देर हो चुकी है, लेकिन सोचा कि मैं इसे वैसे भी साझा करूंगा। यदि आप तारों के रूप में पथों के साथ पूरी तरह से काम कर रहे हैं, तो यह पता लगाने के लिए पाई के रूप में आसान है:

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)

यहां ध्यान रखें कि यह केवल पथों के साथ ही काम करता है, न कि पथ और "भौतिक डिस्क" के बीच संबंध ... इसलिए यह आपको नहीं बता सकता कि पथ / फ़ाइल मौजूद है या ऐसा कुछ भी है, लेकिन यह निश्चित है आपको बता सकता है कि पथ एक फ़ोल्डर या फ़ाइल है ...




यहां हम क्या उपयोग करते हैं:

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

  }

}



यदि आप निर्देशिकाएं खोजना चाहते हैं, जिनमें "छिपी हुई" और "सिस्टम" चिह्नित हैं, तो इसे आजमाएं (.NET V4 की आवश्यकता है):

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



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



सबसे सटीक दृष्टिकोण 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);
}



ये मेरा:

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

यह दूसरों के उत्तरों के समान है लेकिन बिल्कुल वही नहीं है।




Links