ktsu.StrongPaths 1.3.2

Prefix Reserved
dotnet add package ktsu.StrongPaths --version 1.3.2
                    
NuGet\Install-Package ktsu.StrongPaths -Version 1.3.2
                    
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="ktsu.StrongPaths" Version="1.3.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ktsu.StrongPaths" Version="1.3.2" />
                    
Directory.Packages.props
<PackageReference Include="ktsu.StrongPaths" />
                    
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 ktsu.StrongPaths --version 1.3.2
                    
#r "nuget: ktsu.StrongPaths, 1.3.2"
                    
#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.
#addin nuget:?package=ktsu.StrongPaths&version=1.3.2
                    
Install ktsu.StrongPaths as a Cake Addin
#tool nuget:?package=ktsu.StrongPaths&version=1.3.2
                    
Install ktsu.StrongPaths as a Cake Tool

ktsu.StrongPaths

A library providing strong typing for common filesystem paths with compile-time feedback and runtime validation

License NuGet NuGet Downloads Build Status GitHub Stars

Introduction

StrongPaths is a collection of classes derived from ktsu.StrongStrings with added functionality and helper methods for filesystem paths. It provides strong typing for common filesystem paths, giving you compile-time feedback and runtime validation to help catch path-related errors early in your development cycle.

Get familiar with the StrongStrings library to get the most out of StrongPaths.

Features

  • Strong Typing for file system paths to prevent type confusion
  • Path Combination using overloaded operators for intuitive path building
  • Compile-time Safety to catch type mismatches early
  • Runtime Validation for path format and structure
  • Relative Path Calculations between different path types
  • Hierarchical Type System for flexible parameter constraints

Installation

Package Manager Console

Install-Package ktsu.StrongPaths

.NET CLI

dotnet add package ktsu.StrongPaths

Package Reference

<PackageReference Include="ktsu.StrongPaths" Version="x.y.z" />

Usage Examples

Basic Example

using ktsu.StrongPaths;

// Create strongly-typed paths
AbsoluteDirectoryPath rootDir = (AbsoluteDirectoryPath)@"C:\Projects";
RelativeDirectoryPath subDir = (RelativeDirectoryPath)"MyProject";
FileName configFile = (FileName)"config.json";

// Combine paths with the / operator
AbsoluteFilePath fullPath = rootDir / subDir / configFile;

// Use with standard file operations
File.WriteAllText(fullPath, "{ \"setting\": \"value\" }");

Path Combining with Operators

using ktsu.StrongPaths;

public class MyDemoClass
{
    public AbsoluteDirectoryPath OutputDir { get; set; } = (AbsoluteDirectoryPath)@"c:\output";

    public void SaveData(RelativeDirectoryPath subDir, FileName fileName)
    {
        // You can use the / operator to combine paths
        AbsoluteFilePath filePath = OutputDir / subDir / fileName;
        File.WriteAllText(filePath, "Hello, world!");

        // An AbsoluteDirectoryPath combined with a RelativeDirectoryPath returns an AbsoluteDirectoryPath
        AbsoluteDirectoryPath newOutputDir = OutputDir / subDir;

        // An AbsoluteDirectoryPath combined with a FileName returns an AbsoluteFilePath
        AbsoluteFilePath newFilePath = newOutputDir / fileName;
    }
}

Calculating Relative Paths

using ktsu.StrongPaths;

AbsoluteDirectoryPath baseDir = (AbsoluteDirectoryPath)@"C:\Projects\MainProject";
AbsoluteDirectoryPath targetDir = (AbsoluteDirectoryPath)@"C:\Projects\MainProject\Submodule\Source";
AbsoluteFilePath targetFile = (AbsoluteFilePath)@"C:\Projects\MainProject\Submodule\Source\Program.cs";

// Get relative paths from one location to another
RelativeDirectoryPath relativeDir = targetDir.RelativeTo(baseDir);  // "Submodule\Source"
RelativeFilePath relativeFile = targetFile.RelativeTo(baseDir);     // "Submodule\Source\Program.cs"

Advanced Usage

Using Abstract Base Classes

You can use abstract base classes to accept a subset of path types in your method parameters:

using ktsu.StrongPaths;

public static class MyDemoClass
{
    public static void SaveData(AnyDirectoryPath outputDir, FileName fileName)
    {
        // You can't use the / operator with the abstract base classes because it has no way of knowing which type to return
        // You have to use the Path.Combine method when using the abstract base classes
        FilePath filePath = (FilePath)Path.Combine(outputDir, fileName);
        File.WriteAllText(filePath, "Hello, World!");
    }

    public static void Demo()
    {
        string storeLocation = "melbourne";
        RelativeDirectoryPath storeDir = (RelativeDirectoryPath)$"store_{storeLocation}";
        FileName fileName = (FileName)$"{DateTime.UtcNow}.json";
        SaveData(storeDir, fileName);
    }
}

Path Validation and Creation

using ktsu.StrongPaths;

// Validate paths at creation
try 
{
    // This will throw if the path is invalid
    AbsoluteFilePath invalidPath = (AbsoluteFilePath)"not:a:valid:path";
}
catch (FormatException ex)
{
    Console.WriteLine("Invalid path format: " + ex.Message);
}

// Create a directory if it doesn't exist
AbsoluteDirectoryPath projectDir = (AbsoluteDirectoryPath)@"C:\Projects\NewProject";
if (!Directory.Exists(projectDir))
{
    Directory.CreateDirectory(projectDir);
}

API Reference

Available Types

Concrete Types
Type Description
AbsolutePath Base type for all absolute paths
RelativePath Base type for all relative paths
DirectoryPath Base type for all directory paths
FilePath Base type for all file paths
FileName Represents just a filename with extension
FileExtension Represents just a file extension
AbsoluteDirectoryPath Represents an absolute directory path
RelativeDirectoryPath Represents a relative directory path
AbsoluteFilePath Represents an absolute file path
RelativeFilePath Represents a relative file path
Abstract Base Classes
Type Accepted Derived Types
AnyStrongPath All concrete path types
AnyRelativePath RelativePath, RelativeDirectoryPath, RelativeFilePath
AnyAbsolutePath AbsolutePath, AbsoluteDirectoryPath, AbsoluteFilePath
AnyDirectoryPath DirectoryPath, AbsoluteDirectoryPath, RelativeDirectoryPath
AnyFilePath FilePath, AbsoluteFilePath, RelativeFilePath

Key Operations

Operation Description
/ operator Combines paths with appropriate type safety
RelativeTo(...) Calculates a relative path between two locations
Type casting Convert between string and path types with validation

Contributing

Contributions are welcome! Please feel free to submit a pull request.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

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

NuGet packages (8)

Showing the top 5 NuGet packages that depend on ktsu.StrongPaths:

Package Downloads
ktsu.AppDataStorage

Application data management library using JSON serialization to save and load data in the user's app data folder.

ktsu.ImGuiApp

A .NET library that provides application scaffolding for Dear ImGui, using Silk.NET and ImGui.NET.

ktsu.ImGuiWidgets

A library of custom widgets using ImGui.NET and utilities to enhance ImGui-based applications.

ktsu.ImGuiPopups

A library for custom popups using ImGui.NET.

ktsu.CredentialCache

CredentialCache

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.3.2 232 5/21/2025
1.3.2-pre.17 109 5/20/2025
1.3.2-pre.15 73 5/17/2025
1.3.2-pre.14 118 5/16/2025
1.3.2-pre.13 189 5/15/2025
1.3.2-pre.12 189 5/14/2025
1.3.2-pre.11 192 5/13/2025
1.3.2-pre.10 220 5/12/2025
1.3.2-pre.9 159 5/11/2025
1.3.2-pre.8 102 5/10/2025
1.3.2-pre.7 39 5/9/2025
1.3.2-pre.6 112 5/8/2025
1.3.2-pre.5 112 5/7/2025
1.3.2-pre.4 107 5/6/2025
1.3.2-pre.3 114 5/5/2025
1.3.2-pre.2 111 5/4/2025
1.3.2-pre.1 113 5/4/2025
1.3.1 2,347 5/4/2025
1.3.1-pre.2 48 4/26/2025
1.3.1-pre.1 112 4/4/2025
1.3.0 1,994 3/30/2025
1.2.1-pre.3 75 3/29/2025
1.2.1-pre.2 449 3/25/2025
1.2.1-pre.1 67 2/18/2025
1.2.0 2,235 2/17/2025
1.1.51-pre.3 64 2/6/2025
1.1.51-pre.2 57 2/5/2025
1.1.51-pre.1 58 2/5/2025
1.1.50 3,098 1/2/2025
1.1.50-pre.28 58 2/4/2025
1.1.50-pre.27 61 2/3/2025
1.1.50-pre.26 59 2/2/2025
1.1.50-pre.25 60 1/31/2025
1.1.50-pre.24 48 1/29/2025
1.1.50-pre.23 49 1/27/2025
1.1.50-pre.22 55 1/25/2025
1.1.50-pre.21 52 1/23/2025
1.1.50-pre.20 54 1/21/2025
1.1.50-pre.19 49 1/20/2025
1.1.50-pre.18 52 1/19/2025
1.1.50-pre.17 49 1/17/2025
1.1.50-pre.16 43 1/15/2025
1.1.50-pre.15 51 1/13/2025
1.1.50-pre.14 55 1/11/2025
1.1.50-pre.13 49 1/10/2025
1.1.50-pre.12 52 1/10/2025
1.1.50-pre.11 45 1/8/2025
1.1.50-pre.10 61 1/7/2025
1.1.50-pre.9 64 1/6/2025
1.1.50-pre.8 76 1/4/2025
1.1.50-pre.7 63 1/3/2025
1.1.50-pre.6 62 1/3/2025
1.1.50-pre.5 62 1/3/2025
1.1.50-pre.4 75 1/1/2025
1.1.50-pre.3 82 12/31/2024
1.1.50-pre.2 62 12/29/2024
1.1.50-pre.1 55 12/28/2024
1.1.49 1,756 12/26/2024
1.1.48 91 12/26/2024
1.1.47 96 12/26/2024
1.1.46 96 12/26/2024
1.1.45 98 12/26/2024
1.1.44 93 12/26/2024
1.1.43 106 12/26/2024
1.1.42 258 12/25/2024
1.1.41 313 12/24/2024
1.1.40 340 12/23/2024
1.1.39 101 12/23/2024
1.1.38 98 12/23/2024
1.1.37 596 12/19/2024
1.1.36 419 12/14/2024
1.1.35 493 12/6/2024
1.1.34 236 12/5/2024
1.1.33 426 12/2/2024
1.1.32 307 12/2/2024
1.1.31 277 12/1/2024
1.1.30 145 12/1/2024
1.1.29 157 11/30/2024
1.1.28 98 11/30/2024
1.1.27 109 11/30/2024
1.1.26 148 11/29/2024
1.1.25 213 11/28/2024
1.1.24 262 11/26/2024
1.1.23 585 11/15/2024
1.1.22 227 11/14/2024
1.1.21 214 11/13/2024
1.1.20 552 11/5/2024
1.1.19 250 11/2/2024
1.1.18 305 11/1/2024
1.1.17 806 10/17/2024
1.1.16 526 10/8/2024
1.1.15 236 10/5/2024
1.1.14 192 10/4/2024
1.1.13 526 9/24/2024
1.1.12 219 9/21/2024
1.1.11 225 9/19/2024
1.1.10 172 9/19/2024
1.1.9 168 9/19/2024
1.1.8 105 9/19/2024
1.1.7 163 9/19/2024
1.1.6 127 9/18/2024
1.1.5 111 9/18/2024
1.1.4 254 9/18/2024
1.1.3 368 9/18/2024
1.1.2 371 9/14/2024

## v1.3.2

Initial release or repository with no prior history.