ActDim.BytePath.FileSystemStore 1.0.16

dotnet add package ActDim.BytePath.FileSystemStore --version 1.0.16
                    
NuGet\Install-Package ActDim.BytePath.FileSystemStore -Version 1.0.16
                    
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="ActDim.BytePath.FileSystemStore" Version="1.0.16" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ActDim.BytePath.FileSystemStore" Version="1.0.16" />
                    
Directory.Packages.props
<PackageReference Include="ActDim.BytePath.FileSystemStore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ActDim.BytePath.FileSystemStore --version 1.0.16
                    
#r "nuget: ActDim.BytePath.FileSystemStore, 1.0.16"
                    
#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.
#:package ActDim.BytePath.FileSystemStore@1.0.16
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ActDim.BytePath.FileSystemStore&version=1.0.16
                    
Install as a Cake Addin
#tool nuget:?package=ActDim.BytePath.FileSystemStore&version=1.0.16
                    
Install as a Cake Tool

ActDim.BytePath.FileSystemStore

File-system blob data store implementation for ActDim.BytePath.

Features

  • URL-Safe Hierarchy & Hash-Sharded Storage: Splits multi-segment keys by HierarchySeparator (defaults to ':' per RFC 3986 pchar) into directory structures, or applies uniform 2-level XxHash3 hash-sharding for flat keys.
  • Lossless Bijective Escaping: Reversibly escapes invalid filename characters (%XX) while preserving file extensions for ResolveLocationAsync.
  • Windows Device Name & Trailing Char Protection: Escapes DOS device names (CON, PRN, AUX, NUL, COM1-COM9, LPT1-LPT9) and trailing dots/spaces to prevent silent Win32 file aliasing and collisions.
  • Direct & Piped Streaming: Zero-copy stream reads and file writes.
  • Empty Directory Pruning: Automatically cleans up empty parent subdirectories on deletion down to the root base directory.

Installation

dotnet add package ActDim.BytePath.FileSystemStore

Key Format & Storage Layout

Logical Separator (:)

Keys use : (colon) as the standard logical namespace delimiter (e.g. tenant:reports:2026:august.pdf). Colon is unreserved in RFC 3986 pchar, making keys safe to pass directly inside URL path segments (/api/blobs/{key}) without percent-encoding issues or catch-all route collisons.

Storage Layout Rules

  • Multi-Segment Keys: When HierarchySeparator is set (default ':'), a key with multiple segments is placed in matching subdirectories (_basePath/tenant/reports/2026/august.pdf).
  • Single-Segment / Flat Keys: Keys without the hierarchy separator are uniformly distributed into 2-level directory buckets derived from the 64-bit non-cryptographic XxHash3 of the key (_basePath/hash[0..2]/hash[2..4]/filename).
  • Pure Hash-Sharding: Setting options.HierarchySeparator = null disables directory splitting and routes all keys through hash-sharded buckets.

Escaping Mechanics

  1. Reversible %XX Encoding: Invalid filesystem characters (Path.GetInvalidFileNameChars()) and % itself are hex-encoded (%XX), guaranteeing zero collisions.
  2. File Extension Preservation: Standard filename characters and extensions (.png, .pdf) remain untouched for direct path resolution via ResolveLocationAsync.
  3. DOS/Windows Device Names: Reserved names (CON, PRN, AUX, NUL, COM1-COM9, LPT1-LPT9 with or without extensions) have their first character escaped (e.g. con.txt%63on.txt) so Win32 never mistakes a file for a system device pipe.
  4. Trailing Dots & Spaces: Win32 silently trims trailing . and ; escaping them (%2E, %20) ensures name. and name never alias to the same file.

Quick Start

services.AddBlobManager(builder =>
{
    builder.WithFileSystemDataStore(options =>
    {
        options.BaseDirectory = "./my-blobs";
        options.HierarchySeparator = ':'; // default, or null for pure hash-sharding
    });
});

AI-Assisted Development

Developed with Along - a provider-agnostic context and memory system for AI coding agents.

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

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
1.0.16 92 9/9/2026