Ave.Extensions.FileSystem.MimeDetective
0.3.0-preview.1
dotnet add package Ave.Extensions.FileSystem.MimeDetective --version 0.3.0-preview.1
NuGet\Install-Package Ave.Extensions.FileSystem.MimeDetective -Version 0.3.0-preview.1
<PackageReference Include="Ave.Extensions.FileSystem.MimeDetective" Version="0.3.0-preview.1" />
<PackageVersion Include="Ave.Extensions.FileSystem.MimeDetective" Version="0.3.0-preview.1" />
<PackageReference Include="Ave.Extensions.FileSystem.MimeDetective" />
paket add Ave.Extensions.FileSystem.MimeDetective --version 0.3.0-preview.1
#r "nuget: Ave.Extensions.FileSystem.MimeDetective, 0.3.0-preview.1"
#addin nuget:?package=Ave.Extensions.FileSystem.MimeDetective&version=0.3.0-preview.1&prerelease
#tool nuget:?package=Ave.Extensions.FileSystem.MimeDetective&version=0.3.0-preview.1&prerelease
Ave.Extensions.FileSystem
Cross-platform filesystem operations for .NET applications with advanced path mapping and security features.
Features
- Cross-platform file system operations - Consistent API across Windows, Linux, and macOS
- Canonical path mapping - Use Unix-style paths (
/mnt/c/folder/file.txt
) on all platforms - Path security validation - Restrict file access to allowed directories with wildcard support
- Functional error handling - Uses
Result<T, Error>
pattern instead of exceptions - Async enumeration - Stream large directory listings efficiently
- File system monitoring - Real-time change notifications with reactive streams
- High-performance move and copy operations - Native platform optimizations with progress reporting
- Dependency injection ready - Full integration with Microsoft.Extensions.DependencyInjection
- NetStandard 2.1 compatible - Works with .NET Core 3.0+ and .NET 5+
Packages
Package | Description |
---|---|
Ave.Extensions.FileSystem.Abstractions |
Interfaces and abstractions for file system operations |
Ave.Extensions.FileSystem |
Core implementation with path mapping and security features |
Ave.Extensions.FileSystem.Local |
Local file system implementation using System.IO |
Ave.Extensions.FileSystem.InMemory |
In-memory file system implementation for testing |
Ave.Extensions.FileSystem.AzureFileStorage |
Azure File Storage implementation |
Ave.Extensions.FileSystem.MimeDetective |
MIME type detection extensions |
Getting Started
Install the packages from NuGet:
dotnet add package Ave.Extensions.FileSystem.Local
Basic Usage
using Ave.Extensions.FileSystem.Local;
using Microsoft.Extensions.DependencyInjection;
// Setup with DI
services.AddFileSystem();
// Usage
public class MyService
{
private readonly IFileSystem _fileSystem;
public MyService(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}
public async Task ProcessFile(string path)
{
var result = await _fileSystem.FileExistsAsync(path);
if (result.IsSuccess && result.Value)
{
var contentResult = await _fileSystem.ReadAllTextAsync(path);
if (contentResult.IsSuccess)
{
var content = contentResult.Value;
// Process content...
}
}
}
}
Move and Copy Operations
The library provides high-performance move and copy operations with native platform optimizations, progress reporting, and comprehensive error handling.
File Operations
// Copy a file
var copyResult = await fileSystem.CopyFileAsync(
source: "/data/original.txt",
destination: "/backup/copy.txt",
overwrite: true
);
if (copyResult.IsSuccess)
{
Console.WriteLine("File copied successfully");
}
// Move a file
var moveResult = await fileSystem.MoveFileAsync(
source: "/temp/upload.dat",
destination: "/processed/upload.dat",
overwrite: false
);
Directory Operations
// Copy entire directory structure
var copyDirResult = await fileSystem.CopyDirectoryAsync(
source: "/source/project",
destination: "/backup/project"
);
// Move directory
var moveDirResult = await fileSystem.MoveDirectoryAsync(
source: "/temp/staging",
destination: "/production/live"
);
Progress Reporting
Monitor progress for large file operations:
using Ave.Extensions.FileSystem;
// Create progress reporter
var progress = new Progress<ICopyProgress>(p =>
{
Console.WriteLine($"Progress: {p.BytesTransferred:N0} / {p.TotalBytes:N0} bytes " +
$"({p.PercentComplete:F1}%) - {p.TransferRate:N0} bytes/sec");
});
// Copy with progress reporting
var result = await fileSystem.CopyFileAsync(
source: "/data/large-file.zip",
destination: "/backup/large-file.zip",
progress: progress
);
Advanced Copy/Move Features
Cross-Volume Operations
The library automatically detects and handles cross-volume moves efficiently:
// Cross-volume move (automatically uses copy + delete)
var result = await fileSystem.MoveFileAsync(
source: "/mnt/c/data/file.txt", // C: drive
destination: "/mnt/d/backup/file.txt" // D: drive
);
Cancellation Support
All operations support cancellation tokens:
using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(5));
try
{
var result = await fileSystem.CopyDirectoryAsync(
source: "/large/dataset",
destination: "/backup/dataset",
cancellationToken: cts.Token
);
}
catch (OperationCanceledException)
{
Console.WriteLine("Operation was cancelled");
}
File Attribute Preservation
File attributes, timestamps, and metadata are preserved when supported by the platform:
// Attributes are automatically preserved
var result = await fileSystem.CopyFileAsync(
source: "/data/important.doc",
destination: "/backup/important.doc"
);
// The copied file will maintain:
// - Creation time
// - Last modified time
// - File attributes (ReadOnly, Hidden, etc.)
// - Extended attributes (when supported)
Error Handling
All operations return Result<T, FileSystemError>
for functional error handling:
var result = await fileSystem.CopyFileAsync(source, destination);
if (result.IsFailure)
{
switch (result.Error.Type)
{
case FileSystemErrorType.FileNotFound:
Console.WriteLine($"Source file not found: {result.Error.Path}");
break;
case FileSystemErrorType.InsufficientSpace:
Console.WriteLine("Not enough disk space for copy operation");
break;
case FileSystemErrorType.AccessDenied:
Console.WriteLine("Permission denied");
break;
case FileSystemErrorType.FileAlreadyExists:
Console.WriteLine("Destination already exists (use overwrite: true)");
break;
default:
Console.WriteLine($"Copy failed: {result.Error.Message}");
break;
}
}
Platform-Specific Optimizations
Local File System
- Windows: Uses native
MoveFileEx
API for atomic moves within same volume - Linux/macOS: Uses
rename()
system call for atomic moves within same filesystem - Cross-volume: Automatically falls back to copy + delete with transactional cleanup
Azure File Storage
- Server-side copy: Uses Azure's native copy operations for efficient transfers
- Parallel uploads: Large files are transferred using optimized chunking
- Eventual consistency: Handles Azure's consistency model for directory operations
In-Memory File System
- Zero-copy moves: Memory-based moves are instantaneous within same volume
- Copy-on-write: Efficient copying using reference counting where possible
Extension Methods
Convenient extension methods are available in the Ave.Extensions.FileSystem
namespace:
using Ave.Extensions.FileSystem;
// Generic move/copy operations (auto-detects file vs directory)
var result = await fileSystem.MoveAsync(source, destination, overwrite: true);
var result = await fileSystem.CopyAsync(source, destination, overwrite: false);
// Bulk operations with LINQ
var files = new[] { "/temp/file1.txt", "/temp/file2.txt", "/temp/file3.txt" };
var results = await files.ToAsyncEnumerable()
.SelectAwait(async file => await fileSystem.MoveFileAsync(
file,
file.Replace("/temp/", "/processed/")
))
.ToListAsync();
Canonical Path Mapping
Use Unix-style paths across all platforms:
// Setup with canonical path mapping
services.AddFileSystem(options =>
{
options.UseCanonicalPaths = true;
});
// Now you can use Unix-style paths on Windows
var result = await fileSystem.ReadAllTextAsync("/mnt/c/users/documents/file.txt");
// Automatically maps to C:\users\documents\file.txt on Windows
Path Security
Restrict file system access to specific directories:
services.AddFileSystem(options =>
{
options.EnablePathSecurity = true;
options.AllowedPaths.Add("/app/data");
options.AllowedPaths.Add("/tmp/*");
options.AllowedPaths.Add("/logs");
});
// Only paths under /app/data, /tmp/*, and /logs are accessible
Advanced Configuration
services.AddFileSystem(options =>
{
// Enable canonical path mapping
options.UseCanonicalPaths = true;
// Enable security validation
options.EnablePathSecurity = true;
options.AllowedPaths.Add("/app/**");
options.AllowedPaths.Add("/data/uploads/*");
// Customize other features
options.EnableMonitoring = true;
options.DefaultBufferSize = 8192;
});
Path Mapping Reference
When canonical path mapping is enabled, the library automatically converts between platform-specific and Unix-style paths:
Windows Path Mapping
Canonical Path | Windows System Path | Description |
---|---|---|
/mnt/c/folder/file.txt |
C:\folder\file.txt |
Primary drive mapping (WSL-style) |
/mnt/d/data/logs |
D:\data\logs |
Alternative drive |
/c/folder/file.txt |
C:\folder\file.txt |
Legacy format (still supported for input) |
//server/share/file |
\\server\share\file |
UNC paths |
Unix Path Mapping
On Unix systems (Linux/macOS), canonical paths are used directly:
Canonical Path | Unix System Path |
---|---|
/home/user/file.txt |
/home/user/file.txt |
/var/log/app.log |
/var/log/app.log |
Security Pattern Examples
Pattern | Matches | Description |
---|---|---|
/app/data |
/app/data and /app/data/subfolder/file.txt |
Exact path and subdirectories |
/tmp/* |
/tmp/file.txt but not /tmp/sub/file.txt |
Single level wildcard |
/logs/** |
All files under /logs recursively |
Recursive wildcard |
/config/*.json |
/config/app.json but not /config/sub/app.json |
File extension pattern |
Development
Building
dotnet build
Running Tests
dotnet test
Publishing a New Version
Create a new tag with the version number:
git tag v1.0.0 git push origin v1.0.0
The GitHub Actions workflow will automatically:
- Build and test the code
- Generate NuGet packages
- Create a GitHub Release
- Publish packages to NuGet.org (when configured)
License
MIT
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Ave.Extensions.FileSystem (>= 0.3.0-preview.1)
- Ave.Extensions.FileSystem.Abstractions (>= 0.3.0-preview.1)
- Microsoft.Extensions.DependencyInjection (>= 6.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 6.0.0)
- Mime-Detective (>= 22.7.15)
- System.Reactive (>= 6.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
0.3.0-preview.1 | 244 | 6/10/2025 |
0.2.0-preview.1 | 169 | 6/8/2025 |