使用C#查找目录中的项目是文件还是文件夹



我想使用C#检查目录中的每个项是文件类型还是文件夹类型。我想写一些类似下面代码的东西。但是IsInstanceOfType(FileInfo)IsInstanceOfType(DirectoryInfo)在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
}

您可以使用is运算符检查对象是否可以转换为特定类型:

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

尽管可以使用is运算符解决此问题,但我宁愿避免使用反射,并通过检查Attributes属性来检查它,如下所示:

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

您没有读取所有文件夹的权限。因此,您需要递归地浏览文件夹,并在收到以下异常代码时继续:

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:temptest.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;
}
}
}

您还可以使用FileSystemInfo.FullPath,然后使用DirectoryFile类来检查文件或文件夹是否存在。

所以在你的foreach循环中,它应该是这样的。

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

最新更新