Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Ramstack.FileProviders

NuGetMIT

Ramstack.FileProviders is a collection of lightweight .NET libraries that enhance file handling capabilities in .NET applications, building upon Microsoft.Extensions.FileProviders.

Projects

This repository contains the following projects:

Ramstack.FileProviders.Extensions

Offers useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

To install the Ramstack.FileProviders.ExtensionsNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Extensions

Ramstack.FileProviders

Provides additional implementations of IFileProvider including PrefixedFileProvider and SubFileProvider.

To install the Ramstack.FileProvidersNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders

Ramstack.FileProviders.Globbing

Provides an implementation of the IFileProvider that filters files using include and/or exclude glob patterns for flexible file visibility control.

To install the Ramstack.FileProviders.GlobbingNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Globbing

Ramstack.FileProviders.Composition

Provides a helper class for flattening and composing IFileProvider instances.

To install the Ramstack.FileProviders.CompositionNuGet package in your project, run the following command:

dotnet add package Ramstack.FileProviders.Composition

Overview

Ramstack.FileProviders

This library offers additional implementations of the IFileProvider interface:

  • SubFileProvider
  • PrefixedFileProvider

PrefixedFileProvider

PrefixedFileProvider allows you to apply a prefix to the paths of files and directories. This is useful when you need to organize files in a virtual hierarchy.

Example:

IFileProviderprovider=newPrefixedFileProvider("/project/app",innerProvider);IFileInfofile=provider.GetFileInfo("/project/app/docs/README");Console.WriteLine(file.Exists);

This is how you can add virtual directories to your project that are outside the project root:

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=newCompositeFileProvider(newPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),newPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),environment.ContentRootFileProvider);

The Packages and Themes directories are now available to the ASP.NET infrastructure under their respective names, as if they were originally defined within your project.

Before:

/App
├── Controllers
├── Models
├── Views
└── wwwroot
/Packages
├── package-1
└── package-2
/Themes
├── theme-1
└── theme-2

After:

/App
├── Controllers
├── Models
├── Views
├── Packages <-- (virtual)
│ ├── package-1
│ └── package-2
├── Themes <-- (virtual)
│ ├── theme-1
│ └── theme-2
└── wwwroot

SubFileProvider

SubFileProvider lets you limit the view of the file system to a specific subdirectory, effectively creating a sandbox.

Example:

IFileProviderprovider=newSubFileProvider("/docs",innerProvider);IFileInfofile=provider.GetFileInfo("/README");Console.WriteLine(file.Exists);

Ramstack.FileProviders.Globbing

The GlobbingFileProvider class filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.

It relies on the Ramstack.Globbing package for its globbing capabilities.

Example:

IFileProviderprovider=newGlobbingFileProvider(innerProvider,patterns:["**/*.txt","docs/*.md"],excludes:["**/README.md"]);foreach(IFileInfofileinprovider.GetDirectoryContents("/"))Console.WriteLine(file.Name);

Ramstack.FileProviders.Extensions

Provides useful extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.

Simply stated, a FileNode knows which directory it is located in, and a directory represented by the DirectoryNode class can access its parent directory and list all files within it, recursively.

usingRamstack.FileProviders;FileNodefile=provider.GetFile("/docs/README");// Prints the full path of the given fileConsole.WriteLine($"Reading: {file.FullName}");usingStreamReaderreader=file.OpenText();Console.WriteLine(reader.ReadToEnd());
DirectoryNodedirectory=provider.GetDirectory("/docs");foreach(FileNodefileindirectory.EnumerateFiles())Console.WriteLine(file.FullName);

Furthermore, the methods for enumerating files (EnumerateFiles/EnumerateDirectories/EnumerateFileNodes) allow specifying glob patterns to search for the desired files, as well as patterns to exclude files from the resulting list.

DirectoryNodedirectory=provider.GetDirectory("/project");// Finds all *.md files and converts them to HTMLforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md"))RenderMarkdown(file);// Excludes files in a specific folderforeach(FileNodefileindirectory.EnumerateFiles(pattern:"**/*.md",exclude:"vendors/**"))RenderMarkdown(file);

For convenience, many methods specific to DirectoryNode or FileNode are also available for IFileProvider.

Thus, if we know the directory in which to look for files or the file to read, there is no need to obtain the DirectoryNode or FileNode object.

usingStreamReaderreader=provider.OpenText("/docs/README",Encoding.UTF8);Console.WriteLine(reader.ReadToEnd());// Finds all *.md files and converts them to HTMLforeach(FileNodefileinprovider.EnumerateFiles("/project",pattern:"**/*.md"))RenderMarkdown(file);

Ramstack.FileProviders.Composition

Provides a helper class FileProviderComposer for flattening and composing IFileProvider instances.

Flattening Providers

The FlattenProvider method attempts to flatten a given IFileProvider into a single list of file providers.

This is especially useful when dealing with nested CompositeFileProvider instances, which might have been created during different stages of a pipeline or configuration. Flattening helps in removing unnecessary indirectness and improving efficiency by consolidating all file providers into a single level.

varbuilder=WebApplication.CreateBuilder(args);// Application pipeline configuration
...builder.Environment.ContentRootFileProvider=FileProviderComposer.FlattenProvider(builder.Environment.ContentRootFileProvider);

Composing Providers

The ComposeProviders method combines a list of IFileProvider instances into a single IFileProvider. During this process, all encountered CompositeFileProvider instances are recursively flattened and merged into a single level. This eliminates unnecessary indirectness and streamlines the file provider hierarchy.

stringpackagesPath=Path.Combine(environment.ContentRootPath,"../Packages");stringthemesPath=Path.Combine(environment.ContentRootPath,"../Themes");environment.ContentRootFileProvider=FileProviderComposer.ComposeProviders(// Inject external Packages directorynewPrefixedFileProvider("/Packages",newPhysicalFileProvider(packagesPath)),// Inject external Themes directorynewPrefixedFileProvider("/Themes",newPhysicalFileProvider(themesPath)),// Current providerenvironment.ContentRootFileProvider);

In this example, the ComposeProviders method handles any unnecessary nesting that might occur, including when the current environment.ContentRootFileProvider is a CompositeFileProvider. This ensures that all file providers are merged into a single flat structure, avoiding unnecessary indirectness.

Flattening Change Tokens

The Flatten extension method optimizes the structure of change token hierarchies by flattening nested CompositeChangeToken instances and, most importantly, automatically filters out NullChangeToken instances from the hierarchy. Unlike standard CompositeChangeToken behavior, which retains and processes NullChangeToken instances unnecessarily, this utility removes them completely, resulting in improved performance and simplified change notification chains.

varchangeToken=compositeFileProvider.Watch("**/*.json").Flatten();

NuGet Packages

  • Ramstack.FileProviders.Extensions — Useful and convenient extensions for IFileProvider, bringing its capabilities and experience closer to what's provided by the DirectoryInfo and FileInfo classes.
  • Ramstack.FileProviders — Additional file providers, including PrefixedFileProvider and SubFileProvider.
  • Ramstack.FileProviders.Globbing — A file provider that filters files using include and/or exclude glob patterns. Include patterns make only matching files visible, while exclude patterns hide specific files. Both include and exclude patterns can be combined for flexible file visibility control.
  • Ramstack.FileProviders.Composition — Provides a helper class for flattening and composing IFileProvider.

Supported versions

Version
.NET6, 7, 8, 9, 10

Contributions

Bug reports and contributions are welcome.

License

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

About

A lightweight .NET library of useful and convenient extensions for Microsoft.Extensions.FileProviders

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages