Skip to content
Auto
Products

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.

  • 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, or null where the storage has no single top directory, such as the local file system on Windows.
  • FileSystem.Features, which reports what the storage supports as FileSystemFeatures flags.
  • 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.0 target next to netstandard2.0 and netstandard2.1.
  • The license is Apache-2.0, previously MIT.
  • FileSystem.Features replaces SupportsIsHiddenMetadata, SupportsIsReadOnlyMetadata, SupportsLastWriteTimeMetadata, SupportsWriteOperations, SupportsSyncOperations, SupportsPermissions and SupportsWatcher.
  • A custom provider declares its features through IFileSystemFeatureSupport and FileSystemOperationsFeatures, which replace IFileSystemMetadataSupport. 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 the FileSystemFlags.IsDirectoryAsPrefix constructor argument.
  • VirtualDirectory, VirtualDirectoryEntry and VirtualFileSystem live in the TagBites.IO namespace, previously TagBites.IO.Virtual.
  • The operation wrappers are named AsyncToSync* and SyncToAsync*, previously AsyncToSynch* and SynchToAsync*.
  • UpdateMetadata and UpdateMetadataAsync raise Changing before the write and Changed after it, previously neither event was raised.
  • Internal invariant violations throw InvalidOperationException instead of Exception, and FileSystemLinkSynchronizer.Add throws ArgumentException for a pair that is already registered.
  • VirtualDirectory entries and BinaryDataStorageManager prefixes are matched ignoring case and culture.
  • AsyncLock and ProxyStream are no longer public.
  • BinaryDataStorageException and BinaryDataStorageNotFoundException can no longer be constructed from outside the library.
  • Listing a directory that does not exist on the local file system threw InvalidCastException instead of returning an empty result.
  • Move of a directory onto an existing destination failed instead of merging the two trees.
  • Move of a directory left the source and destination links stale.
  • Copy and Move left the destination link stale after replacing an existing resource.
  • A recursive GetFiles or GetDirectories did not descend into subdirectories when the provider did not handle recursion itself.
  • GetFileAsync and GetDirectoryAsync returned a link with a relative full name when the target did not exist, unlike the synchronous lookups.
  • HasEqualContent treated 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 Copy and Move was not applied to the write half of a transfer.
  • UpdateMetadata returned 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 VirtualDirectoryEntry kept its aliases registered, so re-adding the same alias collided with the removed entry.
  • VirtualDirectoryEntry kept 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.Local reported support for the hidden attribute on Linux, where setting it does nothing.
  • Test-only maintenance, no changes to the shipped library.
  • 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.
  • FileSystem.Kind returns a KnowFileSystemKind value instead of a loose string.
  • The async-to-sync operations wrapper waited on the calling thread, which could deadlock.
  • Corrections to the file system name and kind introduced in 1.3.8.
  • FileSystem.Name and FileSystem.Kind, so a consumer can tell which storage a link belongs to.
  • FileSystemFlags.DirectoryAsPrefix, describing providers where a directory exists only as a prefix of an object key, such as object storage.
  • Incorrect resolution of network paths.
  • Reading a hash and copying a file on the local file system failed when the file was open in another process.
  • Incorrect resolution of Unix paths.
  • Custom paths and directory separators, so a provider can define its own path syntax.
  • Faster CorrectPath.
  • The local file system no longer treats the read-only attribute of a directory as a write restriction, because Windows does not either.
  • Source link extraction from a virtual file link (VirtualFileSystem.TryExtractSourceLink).
  • 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 DelayWriteStream was not ignored.
  • A stream was queried for its length without checking whether it supports it.
  • Virtual file system: VirtualDirectory and VirtualDirectoryEntry compose 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.
  • OpenRead replaces Read, and direct operations gained async counterparts.
  • Nullable reference types enabled.
  • Renaming a directory link used the wrong underlying call.
  • Async methods did not use ConfigureAwait(false).
  • OpenWrite, with CreateNew merged into the write path.
  • Methods to read all bytes.
  • A method that creates a new file and throws when it already exists.
  • The operations interfaces were split into a finer structure, and the wrappers around them simplified.
  • The Supports* properties were renamed.
  • First tagged release. Unified FileSystem API 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 disposable FileSystem.