Changelog
All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.0.0 - 2026-08-23
Section titled “2.0.0 - 2026-08-23”MemoryFileSystem.CreateMemory(), an in-memory file system that holds a full read/write tree for as long as the instance lives.FileSystem.Root, the top directory of the storage, ornullwhere the storage has no single top directory, such as the local file system on Windows.FileSystem.Features, which reports what the storage supports asFileSystemFeaturesflags.FileSystemLinkSynchronizer.SyncFailed, raised for every failed synchronization attempt with the pair, the exception, the attempt number and whether another attempt follows. Previously a failing pair was retried up to ten times and then dropped without a trace.- The
?wildcard in search patterns, which matches a single character next to*. FileSystemLinkWatcher.IsDisposed.- A
net5.0target next tonetstandard2.0andnetstandard2.1.
Changed
Section titled “Changed”- The license is Apache-2.0, previously MIT.
FileSystem.FeaturesreplacesSupportsIsHiddenMetadata,SupportsIsReadOnlyMetadata,SupportsLastWriteTimeMetadata,SupportsWriteOperations,SupportsSyncOperations,SupportsPermissionsandSupportsWatcher.- A custom provider declares its features through
IFileSystemFeatureSupportandFileSystemOperationsFeatures, which replaceIFileSystemMetadataSupport. Operations without the interface support no optional feature, previously every metadata attribute was reported as supported. - Directories are treated as key prefixes unless the provider declares
FileSystemOperationsFeatures.HierarchicalDirectories, which replaces theFileSystemFlags.IsDirectoryAsPrefixconstructor argument. VirtualDirectory,VirtualDirectoryEntryandVirtualFileSystemlive in theTagBites.IOnamespace, previouslyTagBites.IO.Virtual.- The operation wrappers are named
AsyncToSync*andSyncToAsync*, previouslyAsyncToSynch*andSynchToAsync*. UpdateMetadataandUpdateMetadataAsyncraiseChangingbefore the write andChangedafter it, previously neither event was raised.- Internal invariant violations throw
InvalidOperationExceptioninstead ofException, andFileSystemLinkSynchronizer.AddthrowsArgumentExceptionfor a pair that is already registered. VirtualDirectoryentries andBinaryDataStorageManagerprefixes are matched ignoring case and culture.AsyncLockandProxyStreamare no longer public.BinaryDataStorageExceptionandBinaryDataStorageNotFoundExceptioncan no longer be constructed from outside the library.
- Listing a directory that does not exist on the local file system threw
InvalidCastExceptioninstead of returning an empty result. Moveof a directory onto an existing destination failed instead of merging the two trees.Moveof a directory left the source and destination links stale.CopyandMoveleft the destination link stale after replacing an existing resource.- A recursive
GetFilesorGetDirectoriesdid not descend into subdirectories when the provider did not handle recursion itself. GetFileAsyncandGetDirectoryAsyncreturned a link with a relative full name when the target did not exist, unlike the synchronous lookups.HasEqualContenttreated two files with equal hashes as different, so transfers copied content that was already identical.- A file version compared against its source file by path instead of by content.
- The exception resolver passed to
CopyandMovewas not applied to the write half of a transfer. UpdateMetadatareturned the stale link info instead of the refreshed one.- The local watcher reported moves incorrectly and could fail during finalization.
- File history operations bypassed the task factory configured in
GlobalFileSystemConfig. - A removed
VirtualDirectoryEntrykept its aliases registered, so re-adding the same alias collided with the removed entry. VirtualDirectoryEntrykept the caller’s alias array instead of copying it, so a later change to that array affected the entry.- A watcher kept raising events for up to 50 ms after
Dispose. FileSystem.Localreported support for the hidden attribute on Linux, where setting it does nothing.
1.3.13 - 2026-03-13
Section titled “1.3.13 - 2026-03-13”Changed
Section titled “Changed”- Test-only maintenance, no changes to the shipped library.
1.3.12 - 2026-03-13
Section titled “1.3.12 - 2026-03-13”- Resolving the parent of a missing local path caused a stack overflow.
- An exception raised while handling a temporary file is ignored instead of propagating.
1.3.11 - 2024-09-11
Section titled “1.3.11 - 2024-09-11”Changed
Section titled “Changed”FileSystem.Kindreturns aKnowFileSystemKindvalue instead of a loose string.
1.3.10 - 2024-05-27
Section titled “1.3.10 - 2024-05-27”- The async-to-sync operations wrapper waited on the calling thread, which could deadlock.
1.3.9 - 2024-03-23
Section titled “1.3.9 - 2024-03-23”- Corrections to the file system name and kind introduced in 1.3.8.
1.3.8 - 2024-03-21
Section titled “1.3.8 - 2024-03-21”FileSystem.NameandFileSystem.Kind, so a consumer can tell which storage a link belongs to.
1.3.7 - 2024-02-24
Section titled “1.3.7 - 2024-02-24”FileSystemFlags.DirectoryAsPrefix, describing providers where a directory exists only as a prefix of an object key, such as object storage.
1.3.6 - 2024-02-02
Section titled “1.3.6 - 2024-02-02”- Incorrect resolution of network paths.
1.3.5 - 2024-01-01
Section titled “1.3.5 - 2024-01-01”- Reading a hash and copying a file on the local file system failed when the file was open in another process.
1.3.4 - 2023-11-30
Section titled “1.3.4 - 2023-11-30”- Incorrect resolution of Unix paths.
1.3.3 - 2023-10-14
Section titled “1.3.3 - 2023-10-14”- Custom paths and directory separators, so a provider can define its own path syntax.
Performance
Section titled “Performance”- Faster
CorrectPath.
1.3.2 - 2023-10-03
Section titled “1.3.2 - 2023-10-03”- The local file system no longer treats the read-only attribute of a directory as a write restriction, because Windows does not either.
1.3.1 - 2023-07-26
Section titled “1.3.1 - 2023-07-26”- Source link extraction from a virtual file link (
VirtualFileSystem.TryExtractSourceLink).
1.3.0 - 2023-06-28
Section titled “1.3.0 - 2023-06-28”- Proxy file system link with caching of the inner link.
AsyncLock.
- A proxy file system did not dispose its inner file system.
- The delayed write stream was not marked read-only when it should be.
- An exception from deleting the temporary file of
DelayWriteStreamwas not ignored.
1.2.1 - 2023-05-16
Section titled “1.2.1 - 2023-05-16”- A stream was queried for its length without checking whether it supports it.
1.2.0 - 2023-02-16
Section titled “1.2.0 - 2023-02-16”- Virtual file system:
VirtualDirectoryandVirtualDirectoryEntrycompose links from several file systems into one logical tree. - Async variants of refresh and of getting a link, file or directory, including from a directory.
- Link info is loaded during async operations instead of falling back to a synchronous read.
Changed
Section titled “Changed”OpenReadreplacesRead, and direct operations gained async counterparts.- Nullable reference types enabled.
1.1.1 - 2023-01-14
Section titled “1.1.1 - 2023-01-14”- Renaming a directory link used the wrong underlying call.
- Async methods did not use
ConfigureAwait(false).
1.1.0 - 2021-10-23
Section titled “1.1.0 - 2021-10-23”OpenWrite, withCreateNewmerged into the write path.- Methods to read all bytes.
- A method that creates a new file and throws when it already exists.
Changed
Section titled “Changed”- The operations interfaces were split into a finer structure, and the wrappers around them simplified.
- The
Supports*properties were renamed.
1.0.3 - 2021-07-23
Section titled “1.0.3 - 2021-07-23”- First tagged release. Unified
FileSystemAPI over the local disk with copy, move, synchronization and file history, metadata support flags, asynchronous operation wrappers, a link bag with preferred storage, ignored paths for synchronization, Win32 wildcards and a disposableFileSystem.