Thanks to visit codestin.com
Credit goes to github.com

Skip to content

An improvement on Window's existing .NET Framework API for finding files.

License

Notifications You must be signed in to change notification settings

trigger-segfault/TriggersTools.FileFind

Repository files navigation

TriggersTools.FileFind AppIcon

NuGet Version NuGet Downloads Creation Date Discord

An improvement on Window's existing .NET Framework API for finding files. Enumeration no longer fails when encountering a secure file. File numeration is a little bit faster. Added support for matching file names by Regex.

General Info

The static class FileFind works very similarly to how Directory and DirectoryInfo's enumerations work. To allow returning a preconstructed FileInfo/DirectoryInfo, FileFind uses its own class called FileFindInfo.

FileFindInfo contains the following properties:

class FileFindInfo {
    string FullName { get; }
    string Name { get; }
    long Size { get; }
    FileAttributes Attributes { get; }
    DateTime CreationTimeUtc { get; }
    DateTime CreationTime { get; }
    DateTime LastAccessTimeUtc { get; }
    DateTime LastAccessTime { get; }
    DateTime LastWriteTimeUtc { get; }
    DateTime LastWriteTime { get; }
    bool IsDirectory { get; }
    bool IsSymbolicLink { get; }
}

Basic Example

Basic examples of enumerating file paths/infos or getting the same result as an array.

using TriggersTools.IO.Windows;

// List all files in the source directory
foreach (string file in FileFind.EnumerateFiles("Source", "*.cs", SearchOrder.AllDirectories))
    Console.WriteLine(file);

// Get an array of the same files as FileFindInfos
FileFindInfo[] infos = FileFind.GetFileInfos("Source", "*.cs", SearchOrder.AllDirectories);

// Count the total number of items and size of every item in the C: drive.
long totalItems = 0;
long totalSize = 0;
// Use depth order search, folders with 4 ancestores
// will be scanned before folder with 5 ancestores.
foreach (string file in FileFind.EnumerateFileSystemInfos(@"C:\", "*", SearchOrder.AllDepths)) {
    totalItems++;
    totalSize += file.Size;
}
Console.WriteLine($"Total Items: {totalItems:N0}");
Console.WriteLine($"Total Bytes: {totalSize:N0}");

About SearchOrder

Unlike .NET's SearchOption of TopDirectoryOnly or AllDirectories with enumerating files, FileFind comes with 4 modes under the SearchOrder enumeration.

Example File Tree:

+ C:\
|-+ Program Files
| '-+ Paint.NET
|   |-+ Effects
|   | '-- Alpha2Gray.dll
|   |-- PaintDotNet.Core.dll
|   '-- PaintDotNet.exe
|-+ Users
| |-+ Trigger
| | |-+ Desktop
| | | '-- My Documents.lnk
| | '-- .gitconfig
| '-+ Public
|   |-- Public Documents
|   '-- Public Downloads
|-- hyberfil.sys
'-- pagefile.sys
  • TopDirectoryOnly: Includes only the current directory in a search operation.
EnumerateFileSystemEntries(@"C:\", searchOrder: SearchOrder.TopDirectoryOnly);
- C:\Program Files
- C:\Users
- C:\hyberfil.sys
- C:\pagefile.sys
  • AllDirectories: Each individual subdirectory is searched after the parent directory.
EnumerateFileSystemEntries(@"C:\", searchOrder: SearchOrder.AllDirectories);
- C:\Program Files
- C:\Users
- C:\hyberfil.sys
- C:\pagefile.sys
- C:\Program Files\Paint.NET
- C:\Program Files\Paint.NET\Effects
- C:\Program Files\Paint.NET\PaintDotNet.Core.dll
- C:\Program Files\Paint.NET\PaintDotNet.exe
- C:\Program Files\Paint.NET\Effects\Alpha2Gray.dll
- C:\Users\Trigger
- C:\Users\Public
- C:\Users\Trigger\Desktop
- C:\Users\Trigger\.gitconfig
- C:\Users\Trigger\Desktop\My Documents.lnk
- C:\Users\Public\Public Documents
- C:\Users\Public\Public Downloads
  • AllSubdirectories: Each individual subdirectory is searched when it is encountered.
EnumerateFileSystemEntries(@"C:\", searchOrder: SearchOrder.AllSubdirectories);
- C:\Program Files
- C:\Program Files\Paint.NET
- C:\Program Files\Paint.NET\Effects
- C:\Program Files\Paint.NET\Effects\Alpha2Gray.dll
- C:\Program Files\Paint.NET\PaintDotNet.Core.dll
- C:\Program Files\Paint.NET\PaintDotNet.exe
- C:\Users
- C:\Users\Trigger
- C:\Users\Trigger\Desktop
- C:\Users\Trigger\Desktop\My Documents.lnk
- C:\Users\Trigger\.gitconfig
- C:\Users\Public
- C:\Users\Public\Public Documents
- C:\Users\Public\Public Downloads
- C:\hyberfil.sys
- C:\pagefile.sys
  • AllDepths: Each individual subdirectory is searched in the order of their depth.
EnumerateFileSystemEntries(@"C:\", searchOrder: SearchOrder.AllDepths);
- C:\Program Files
- C:\Users
- C:\hyberfil.sys
- C:\pagefile.sys
- C:\Program Files\Paint.NET
- C:\Users\Trigger
- C:\Users\Public
- C:\Program Files\Paint.NET\Effects
- C:\Program Files\Paint.NET\PaintDotNet.Core.dll
- C:\Program Files\Paint.NET\PaintDotNet.exe
- C:\Users\Trigger\Desktop
- C:\Users\Trigger\.gitconfig
- C:\Users\Public\Public Documents
- C:\Users\Public\Public Downloads
- C:\Program Files\Paint.NET\Effects\Alpha2Gray.dll
- C:\Users\Trigger\Desktop\My Documents.lnk

Regex Search

FileFind also allows the use of directly passing Regex for searching.

// Match 2018 photos following a yyyy-mm-dd format
Regex regex = new Regex(\d{4}-\d\d?-\d\d?.*);
var files FileFind.EnumerateFiles("Camera\2018", regex, SearchOrder.AllDirectories);
foreach (string file in files) {
    // Do something with matched file...
}

Other Functions

FileFind contains a few other functions that make use of FileFind P/Invoke.

// Get the info for the first matching file, returns null when nothing is found.
FileFindInfo GetInfo(string path);

// Gets the properly-cased name of the first matching file, return null when nothing is found.
string GetExactName(string path);

// Gets the properly-cased path of the first matching file, return null when nothing is found.
string GetExactPath(string path);

// Returns true if the directory contains no files. Throws Win32Exception if the directory could not be found.
bool IsDirectoryEmpty(string directory);

About

An improvement on Window's existing .NET Framework API for finding files.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages