ktsu.StrongPaths 1.3.2-pre.17

Prefix Reserved
This is a prerelease version of ktsu.StrongPaths.
There is a newer version of this package available.
See the version list below for details.
dotnet add package ktsu.StrongPaths --version 1.3.2-pre.17
                    
NuGet\Install-Package ktsu.StrongPaths -Version 1.3.2-pre.17
                    
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-pre.17" />
                    
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-pre.17" />
                    
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-pre.17
                    
#r "nuget: ktsu.StrongPaths, 1.3.2-pre.17"
                    
#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 ktsu.StrongPaths@1.3.2-pre.17
                    
#: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=ktsu.StrongPaths&version=1.3.2-pre.17&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=ktsu.StrongPaths&version=1.3.2-pre.17&prerelease
                    
Install 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 comprehensive .NET library that provides complete application scaffolding for Dear ImGui applications, featuring window management, DPI-aware rendering, precision PID-controlled frame limiting with comprehensive auto-tuning, advanced font handling with Unicode/emoji support, texture management, and debug tooling. Built on Silk.NET for cross-platform OpenGL support and Hexa.NET.ImGui for modern Dear ImGui bindings.

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 544 5/21/2025
1.3.2-pre.17 130 5/20/2025
1.3.2-pre.15 92 5/17/2025
1.3.2-pre.14 142 5/16/2025
1.3.2-pre.13 209 5/15/2025
1.3.2-pre.12 208 5/14/2025
1.3.2-pre.11 210 5/13/2025
1.3.2-pre.10 234 5/12/2025
1.3.2-pre.9 178 5/11/2025
1.3.2-pre.8 121 5/10/2025
1.3.2-pre.7 53 5/9/2025
1.3.2-pre.6 130 5/8/2025
1.3.2-pre.5 122 5/7/2025
1.3.2-pre.4 125 5/6/2025
1.3.2-pre.3 125 5/5/2025
1.3.2-pre.2 129 5/4/2025
1.3.2-pre.1 131 5/4/2025
1.3.1 2,963 5/4/2025
1.3.1-pre.2 68 4/26/2025
1.3.1-pre.1 127 4/4/2025
1.3.0 2,302 3/30/2025
1.2.1-pre.3 91 3/29/2025
1.2.1-pre.2 462 3/25/2025
1.2.1-pre.1 84 2/18/2025
1.2.0 2,281 2/17/2025
1.1.51-pre.3 86 2/6/2025
1.1.51-pre.2 74 2/5/2025
1.1.51-pre.1 80 2/5/2025
1.1.50 3,109 1/2/2025
1.1.50-pre.28 73 2/4/2025
1.1.50-pre.27 73 2/3/2025
1.1.50-pre.26 72 2/2/2025
1.1.50-pre.25 69 1/31/2025
1.1.50-pre.24 67 1/29/2025
1.1.50-pre.23 62 1/27/2025
1.1.50-pre.22 67 1/25/2025
1.1.50-pre.21 67 1/23/2025
1.1.50-pre.20 65 1/21/2025
1.1.50-pre.19 62 1/20/2025
1.1.50-pre.18 64 1/19/2025
1.1.50-pre.17 59 1/17/2025
1.1.50-pre.16 65 1/15/2025
1.1.50-pre.15 68 1/13/2025
1.1.50-pre.14 64 1/11/2025
1.1.50-pre.13 57 1/10/2025
1.1.50-pre.12 65 1/10/2025
1.1.50-pre.11 56 1/8/2025
1.1.50-pre.10 78 1/7/2025
1.1.50-pre.9 75 1/6/2025
1.1.50-pre.8 85 1/4/2025
1.1.50-pre.7 78 1/3/2025
1.1.50-pre.6 69 1/3/2025
1.1.50-pre.5 74 1/3/2025
1.1.50-pre.4 84 1/1/2025
1.1.50-pre.3 90 12/31/2024
1.1.50-pre.2 69 12/29/2024
1.1.50-pre.1 66 12/28/2024
1.1.49 1,769 12/26/2024
1.1.48 102 12/26/2024
1.1.47 103 12/26/2024
1.1.46 106 12/26/2024
1.1.45 106 12/26/2024
1.1.44 102 12/26/2024
1.1.43 116 12/26/2024
1.1.42 275 12/25/2024
1.1.41 326 12/24/2024
1.1.40 358 12/23/2024
1.1.39 109 12/23/2024
1.1.38 109 12/23/2024
1.1.37 605 12/19/2024
1.1.36 436 12/14/2024
1.1.35 502 12/6/2024
1.1.34 245 12/5/2024
1.1.33 440 12/2/2024
1.1.32 323 12/2/2024
1.1.31 291 12/1/2024
1.1.30 156 12/1/2024
1.1.29 175 11/30/2024
1.1.28 107 11/30/2024
1.1.27 130 11/30/2024
1.1.26 163 11/29/2024
1.1.25 230 11/28/2024
1.1.24 270 11/26/2024
1.1.23 593 11/15/2024
1.1.22 249 11/14/2024
1.1.21 227 11/13/2024
1.1.20 559 11/5/2024
1.1.19 268 11/2/2024
1.1.18 316 11/1/2024
1.1.17 825 10/17/2024
1.1.16 541 10/8/2024
1.1.15 248 10/5/2024
1.1.14 208 10/4/2024
1.1.13 541 9/24/2024
1.1.12 229 9/21/2024
1.1.11 234 9/19/2024
1.1.10 182 9/19/2024
1.1.9 179 9/19/2024
1.1.8 113 9/19/2024
1.1.7 177 9/19/2024
1.1.6 140 9/18/2024
1.1.5 122 9/18/2024
1.1.4 265 9/18/2024
1.1.3 387 9/18/2024
1.1.2 378 9/14/2024

## v1.3.2-pre.17

Initial release or repository with no prior history.