Home > Software engineering >  Finding if an item in a directory is file or folder using C#?
Finding if an item in a directory is file or folder using C#?

Time:09-27

I want to check if each item in a directory is of type file or a folder in using C#. I want to write something like the code below. But IsInstanceOfType(FileInfo)and IsInstanceOfType(DirectoryInfo) is not allowed in C#.

    DirectoryInfo dirPrograms = new DirectoryInfo(folderPath);                     
    foreach(var dir in dirPrograms.EnumerateFileSystemInfos())
        {
            if (dir.GetType().IsInstanceOfType(FileInfo))
                  //do something
            elseif (dir.GetType().IsInstanceOfType(DirectoryInfo))
                //do something
        }

CodePudding user response:

You can use the is operator to check whether an object can be converted to a specific type:

if (dir is FileInfo)
  // do something
else (dir is DirectoryInfo)
  // Do something

CodePudding user response:

Although you can solve this using the is operator, I'd rather avoid using reflection and check it by inspecting the Attributes property like this:

foreach (var dir in dirPrograms.EnumerateFileSystemInfos())
{
    if (dir.Attributes.HasFlag(FileAttributes.Directory))
    {
        // It's a dir
    }
    else
    {
        // It's a file
    }
}

CodePudding user response:

You do not have permission to read all the folders. So you need to recursively go through folders and continue when you get an exception like code below :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace SAveDirectoriesXml
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        const string FOLDER = @"c:\temp";
        static XmlWriter writer = null;
        static void Main(string[] args)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            writer = XmlWriter.Create(FILENAME, settings);
            writer.WriteStartDocument(true);

            DirectoryInfo info = new DirectoryInfo(FOLDER);
            WriteTree(info);
            
            writer.WriteEndDocument();
            writer.Flush();
            writer.Close();
            Console.WriteLine("Enter Return");
            Console.ReadLine();

        }
        static long WriteTree(DirectoryInfo info)
        {
            long size = 0;
            writer.WriteStartElement("Folder");
            try
            {
                writer.WriteAttributeString("name", info.Name);
                writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
                writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
                writer.WriteAttributeString("date", info.LastWriteTime.ToString());
             

                foreach (DirectoryInfo childInfo in info.GetDirectories())
                {
                    size  = WriteTree(childInfo);
                }
                
            }
            catch (Exception ex)
            {
                string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
                Console.WriteLine(errorMsg);
                writer.WriteElementString("Error", errorMsg);
            }

            FileInfo[] fileInfo = null;
            try
            {
                fileInfo = info.GetFiles();
            }
            catch (Exception ex)
            {
                string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
                Console.WriteLine(errorMsg);
                writer.WriteElementString("Error",errorMsg);
            }

            if (fileInfo != null)
            {
                foreach (FileInfo finfo in fileInfo)
                {
                    try
                    {
                        writer.WriteStartElement("File");
                        writer.WriteAttributeString("name", finfo.Name);
                        writer.WriteAttributeString("size", finfo.Length.ToString());
                        writer.WriteAttributeString("date", info.LastWriteTime.ToString());
                        writer.WriteEndElement();
                        size  = finfo.Length;
                    }
                    catch (Exception ex)
                    {
                        string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
                        Console.WriteLine(errorMsg);
                        writer.WriteElementString("Error", errorMsg);
                    }
                }
            }

            writer.WriteElementString("size", size.ToString());
            writer.WriteEndElement();
            return size;

        }
    }
}

CodePudding user response:

you could also use the FileSystemInfo.FullPath and then the Directory and File classes to check if the file or folder exists.

So in your foreach loop it would be something like this.

if (Directory.Exists(dir.FullPath))
     // do something it its a folder
elseif (File.Exists(dir.FullPath))
     // do something if its a file, shouldn't have to check this condition really but it wouldn't hurt to be safe
  • Related