I have built some extensions to System.IO class DirectoryInfo
GetFiles extension fetches files that match a regular expression either in the name or content.
CopyTo extension copies the files and folders to the destination specified, overwriting if specified.
FileDiff extension gets the difference is the files (by name) between 2 directories. inBoth output parameter contains files common to both, inA contains files only in the A, and inB contains files only in B.
CompareFilesTo extension compares 2 directories for their files (by name) and returns 1 if number of files in dirA is greater thn dirB, -1 if reversed and 0 if equal.
GetDirectories extension fetches directories by a specified sort order (IComparer).
Extensions :
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
namespaceSystem.IO
{
publicstaticclassExtensionMethods
{
#region Enumeratorspublicenum Option
{
SearchContent = 0,
SearchTitle = 1,
SearchTitleAndContent = 2
}
#endregion#region Internal ClassesinternalclassFileInfoComparer : IEqualityComparer<FileInfo>
{
publicboolEquals(FileInfo a, FileInfo b)
{
return a.FullName == b.FullName;
}
publicintGetHashCode(FileInfo fi)
{
return fi.GetHashCode();
}
}
#endregion#region Public Methodspublicstatic FileInfo[] GetFiles(this DirectoryInfo DirectoryInfoObject, string searchPattern, Option option, SearchOption searchOption)
{
List<FileInfo> matchedFiles = new List<FileInfo>();
if (searchOption == SearchOption.AllDirectories)
{
foreach (DirectoryInfo di in DirectoryInfoObject.GetDirectories())
{
matchedFiles.AddRange(di.GetFiles(searchPattern, option, SearchOption.AllDirectories).ToList());
}
}
FileInfoComparer comparer = new FileInfoComparer();
if (option == Option.SearchContent || option == Option.SearchTitleAndContent)
{
foreach (FileInfo fi in DirectoryInfoObject.GetFiles())
{
StreamReader sr = new StreamReader(fi.FullName);
if (Regex.Match(sr.ReadToEnd(), searchPattern).Success)
if (!matchedFiles.Contains(fi, comparer))
matchedFiles.Add(fi);
}
}
if (option == Option.SearchTitle || option == Option.SearchTitleAndContent)
{
foreach (FileInfo fi in DirectoryInfoObject.GetFiles())
{
if (Regex.Match(fi.Name, searchPattern).Success)
if (!matchedFiles.Contains(fi, comparer))
matchedFiles.Add(fi);
}
}
return matchedFiles.ToArray();
}
publicstaticvoidCopyTo(this DirectoryInfo DirectoryInfoObject, string DestinationDirectoryPath, bool Overwrite)
{
if (Overwrite)
{
Directory.Delete(DestinationDirectoryPath, true);
}
CopyHelper(DirectoryInfoObject, DestinationDirectoryPath, Overwrite);
}
publicstaticvoidFileDiff(this DirectoryInfo dirA, DirectoryInfo dirB, out FileInfo[] inBoth, out FileInfo[] inA, out FileInfo[] inB)
{
var inDirBoth = fromfilein dirA.GetFiles().ToList()
join file1 in dirB.GetFiles().ToList() onfile.Name equals file1.Name
selectfile;
var inDirAOnly = fromfilein dirA.GetFiles().ToList()
join file1 in dirB.GetFiles().ToList() onfile.Name equals file1.Name
into diff
from file2 in diff.DefaultIfEmpty()
where file2 == nullselectfile;
var inDirBOnly = fromfilein dirB.GetFiles().ToList()
join file1 in dirA.GetFiles().ToList() onfile.Name equals file1.Name
into diff
from file2 in diff.DefaultIfEmpty()
where file2 == nullselectfile;
inBoth = inDirBoth.ToArray();
inA = inDirAOnly.ToArray();
inB = inDirBOnly.ToArray();
}
publicstaticintCompareFilesTo(this DirectoryInfo dirA, DirectoryInfo dirB)
{
var inDirAOnly = fromfilein dirA.GetFiles().ToList()
join file1 in dirB.GetFiles().ToList() onfile.Name equals file1.Name
into diff
from file2 in diff.DefaultIfEmpty()
where file2 == nullselectfile;
var inDirBOnly = fromfilein dirB.GetFiles().ToList()
join file1 in dirA.GetFiles().ToList() onfile.Name equals file1.Name
into diff
from file2 in diff.DefaultIfEmpty()
where file2 == nullselectfile;
if (inDirAOnly.Count() > inDirBOnly.Count())
return1;
if (inDirAOnly.Count() < inDirBOnly.Count())
return-1;
return0;
}
publicstatic DirectoryInfo[] GetDirectories(this DirectoryInfo di, IComparer<DirectoryInfo> comparer)
{
List<DirectoryInfo> lstDirectories = new List<DirectoryInfo>(di.GetDirectories());
lstDirectories.Sort(comparer);
return lstDirectories.ToArray();
}
publicstatic DirectoryInfo[] GetDirectories(this DirectoryInfo di, Comparison<DirectoryInfo> comparer)
{
List<DirectoryInfo> lstDirectories = new List<DirectoryInfo>(di.GetDirectories());
lstDirectories.Sort(comparer);
return lstDirectories.ToArray();
}
#endregion#region Private MethodsprivatestaticvoidCopyHelper(this DirectoryInfo DirectoryInfoObject, string DestinationDirectoryPath, bool Overwrite)
{
if (!Directory.Exists(DestinationDirectoryPath))
Directory.CreateDirectory(DestinationDirectoryPath);
foreach (string directory in Directory.GetDirectories(DirectoryInfoObject.FullName))
{
DirectoryInfo di = new DirectoryInfo(directory);
di.CopyHelper(DestinationDirectoryPath + @"\" + di.Name, Overwrite);
}
foreach (stringfilein Directory.GetFiles(DirectoryInfoObject.FullName))
{
FileInfo fi = new FileInfo(file);
fi.CopyTo(DestinationDirectoryPath + @"\" + fi.Name, Overwrite);
}
}
#endregion
}
}
Usage :
Java
publicclassDirectoryComparer : IComparer<DirectoryInfo>
{
publicintCompare(DirectoryInfo x, DirectoryInfo y)
{
// if x contains more files than y return 1if (x.GetFiles().Count() > y.GetFiles().Count())
{
return1;
}
//if x contains less files than y return -1if (x.GetFiles().Count() < y.GetFiles().Count())
{
return -1;
}
//if x contains the same number of files as y then return 0return0;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////Copy directory to destinationDirectoryInfodi=newDirectoryInfo(@"c:\Temp\Test");
di.CopyTo(@"c:\Temp\Test1", true);
/////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////Gets directories in ascending order of the number of files they contain using class DirectoryComparer//which implements IComparerDirectoryComparerdirectoryComparer=newDirectoryComparer();
DirectoryInfo[] sortedDirectoryInfos= di.GetDirectories(directoryComparer);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////comparisonResult is 1 if dirB contains less files, -1 if dirB contains more files, 0 if equalintcomparisonResult= di.CompareFilesTo(newDirectoryInfo(@"c:\Temp\Test1"));
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Gets the files (by name) common to both folders in inBoth, files only in dirA in inA and files only //in dirB in inBFileInfo[] inBoth= { };
FileInfo[] inA= { };
FileInfo[] inB= { };
di.FileDiff(newDirectoryInfo(@"c:\Temp\Test1"), out inBoth, out inA, out inB);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Get files containing text that matches a specified regular expressionDirectoryInfodi1=newDirectoryInfo(@"C:\Temp\Test");
FileInfo[] files= di1.GetFiles(@"Testing|IO", ExtensionMethods.Option.SearchContent , SearchOption.AllDirectories);
FileInfo[] files1= di1.GetFiles(@"Test|IO", ExtensionMethods.Option.SearchTitleAndContent, SearchOption.AllDirectories);
///////////////////////////////////////////////////////////////////////////////////////////////////////
Author is a .Net programmer with a specialization in ASP .Net web development. I am experienced in CF .Net embedded systems too. Many years of experience in building .Net systems for the Telecommunications, Health care, Retail, Government and IT consultancy sectors.
Join the conversation! Your thoughts help the community grow.