Ramstack.FileSystem.Abstractions 1.0.0-preview.1

This is a prerelease version of Ramstack.FileSystem.Abstractions.
There is a newer version of this package available.
See the version list below for details.
dotnet add package Ramstack.FileSystem.Abstractions --version 1.0.0-preview.1                
NuGet\Install-Package Ramstack.FileSystem.Abstractions -Version 1.0.0-preview.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ramstack.FileSystem.Abstractions" Version="1.0.0-preview.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Ramstack.FileSystem.Abstractions --version 1.0.0-preview.1                
#r "nuget: Ramstack.FileSystem.Abstractions, 1.0.0-preview.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Ramstack.FileSystem.Abstractions as a Cake Addin
#addin nuget:?package=Ramstack.FileSystem.Abstractions&version=1.0.0-preview.1&prerelease

// Install Ramstack.FileSystem.Abstractions as a Cake Tool
#tool nuget:?package=Ramstack.FileSystem.Abstractions&version=1.0.0-preview.1&prerelease                

Ramstack.FileSystem

Provides a virtual file system abstraction.

Getting Started

To install the Ramstack.FileSystem.Abstractions NuGet package in your project, run the following command:

dotnet add package Ramstack.FileSystem.Abstractions

Overview

The primary interface is IVirtualFileSystem, which exposes methods to:

  • Access files (VirtualFile).
  • Access directories (VirtualDirectory).

VirtualFile

The VirtualFile class provides properties and methods for creating, deleting, and opening files within the virtual file system.

using Ramstack.FileSystem;

public class Program
{
    public static async Task Sample(IVirtualFileSystem fs)
    {
        var file = fs.GetFile("/sample/hello.txt");

        if (await file.ExistsAsync())
        {
            Console.WriteLine($"Deleting file '{file.FullName}'");
            await file.DeleteAsync();
        }

        Console.WriteLine($"Writing 'Hello, World!' to '{file.FullName}'");

        await using (Stream stream = await file.OpenWriteAsync())
        await using (StreamWriter writer = new StreamWriter(stream))
        {
            await writer.WriteLineAsync("Hello, World!");
        }

        Console.WriteLine($"Reading contents of '{file.FullName}'");
        using (StreamReader reader = await file.OpenTextAsync())
        {
            Console.WriteLine(await reader.ReadToEndAsync());
        }

        // Replace content of the file with data from an existing file
        await using FileStream input = File.OpenRead(@"D:\sample\hello-world.txt");
        await file.WriteAsync(input, overwrite: true);

        Console.WriteLine($"The file '{file.Name}' has a length of {await file.GetLengthAsync()} bytes");
    }
}

The VirtualFile class provides the following properties to retrieve information about a file:

  • FileSystem: Gets the IVirtualFileSystem associated with the file.
  • Directory: Gets the VirtualDirectory representing the parent directory.
  • DirectoryName: Gets the full path of the parent directory.
  • IsReadOnly: Indicates whether the file is read-only.
  • Name: Gets the name of the file.
  • Extension: Gets the extension of the file.

The VirtualFile class also exposes a GetPropertiesAsync method to retrieve file properties:

  • Length: Gets the size of the file in bytes.
  • Exists: Indicates whether the file exists.
  • CreationTime: Gets the creation time of the file.
  • LastAccessTime: Gets the last access time of the file.
  • LastWriteTime: Gets the last modification time of the file.

For convenience, many methods specific to VirtualFile are also available as extension methods on IVirtualFileSystem.

For example, if we know the path of the file we want to read, we don't need to obtain a VirtualFile object explicitly:

using StreamReader reader = await fs.OpenTextAsync("/docs/README", Encoding.UTF8);
Console.WriteLine(await reader.ReadToEndAsync());

VirtualDirectory

The VirtualDirectory class provides properties and methods for creating, deleting, and enumerating directories and subdirectories.

public static async Task PrintFilesAsync(VirtualDirectory directory, string padding = "", CancellationToken cancellationToken = default)
{
    await foreach (VirtualNode node in directory.GetFileNodesAsync(cancellationToken))
    {
        Console.WriteLine($"{padding}{node.Name}");

        if (node is VirtualDirectory dir)
        {
            await PrintFilesAsync(dir, padding + "   ", cancellationToken);
        }
    }
}

// Print the file tree
await PrintFilesAsync(fs.GetDirectory("/sample"));

The VirtualDirectory class provides the following properties to retrieve information about a directory:

  • FileSystem: Gets the IVirtualFileSystem associated with the directory.
  • IsRoot: Indicates whether the directory is the root directory.
  • Parent: Gets the VirtualDirectory representing the parent directory.
  • DirectoryName: Gets the full path of the parent directory.
  • IsReadOnly: Indicates whether the directory is read-only.
  • Name: Gets the name of the directory.

The VirtualDirectory class also exposes a GetPropertiesAsync method to retrieve directory properties, if available:

  • Exists: Indicates whether the directory exists.
  • CreationTime: Gets the creation time of the directory.
  • LastAccessTime: Gets the last access time of the directory.
  • LastWriteTime: Gets the last modification time of the directory.
  • Length: Always returns 0 for directories.

For convenience, many methods specific to VirtualDirectory are also available as extension methods on IVirtualFileSystem.

For example, if we know the path of the desired directory, we don't need to obtain a VirtualDirectory object explicitly:

await foreach (VirtualFile file in fs.GetFilesAsync("/sample/directory"))
{
    Console.WriteLine($"Processing: {file.FullName}");
}

// Delete the directory recursively
await fs.DeleteDirectoryAsync("/sample/directory");

Remark

The file system in use may be read-only, and as a result, any modifying operations on files and directories will throw an exception. To check if the file system is read-only, the IVirtualFileSystem, VirtualFile and VirtualDirectory classes provide the IsReadOnly property.

if (!fs.IsReadOnly)
{
    await fs.DeleteFileAsync("/hello.txt");
}

Supported Versions

Version
.NET 6, 7, 8

Contributions

Bug reports and contributions are welcome.

License

This package is released as open source under the MIT License. See the LICENSE file for more details.

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net6.0

    • No dependencies.

NuGet packages (11)

Showing the top 5 NuGet packages that depend on Ramstack.FileSystem.Abstractions:

Package Downloads
Ramstack.FileSystem.Specification.Tests

Suite of NUnit tests to check specifications for Ramstack.FileSystem.

Ramstack.FileSystem.Zip

Provides an implementation of Ramstack.FileSystem for managing files within ZIP archives.

Ramstack.FileSystem.Prefixed

Provides an implementation of Ramstack.FileSystem that adds a specified prefix to the file paths within the underlying file system.

Ramstack.FileSystem.Readonly

Provides an implementation of Ramstack.FileSystem that wraps the underlying file system, preventing any destructive operations.

Ramstack.FileSystem.Sub

Provides an implementation of Ramstack.FileSystem that wraps an underlying file system for managing files under a specific subpath.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.1 306 9/14/2024
1.1.0 278 9/14/2024
1.0.1 282 9/13/2024
1.0.0 252 9/13/2024
1.0.0-preview.9 58 9/10/2024
1.0.0-preview.8 58 9/5/2024
1.0.0-preview.7 55 9/4/2024
1.0.0-preview.6 55 9/3/2024
1.0.0-preview.5 56 8/30/2024
1.0.0-preview.4 70 8/24/2024
1.0.0-preview.3 72 8/22/2024
1.0.0-preview.2 67 8/21/2024
1.0.0-preview.1 60 8/20/2024