FluentStorage 8.0.21

Prefix Reserved
dotnet add package FluentStorage --version 8.0.21
                    
NuGet\Install-Package FluentStorage -Version 8.0.21
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FluentStorage" Version="8.0.21" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FluentStorage" Version="8.0.21" />
                    
Directory.Packages.props
<PackageReference Include="FluentStorage" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FluentStorage --version 8.0.21
                    
#r "nuget: FluentStorage, 8.0.21"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FluentStorage@8.0.21
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FluentStorage&version=8.0.21
                    
Install as a Cake Addin
#tool nuget:?package=FluentStorage&version=8.0.21
                    
Install as a Cake Tool

Please read the Migration Guide to help you migrate from older versions to FluentStorage 8!

FluentStorage 8.0.21
  • FluentStorage
    • Fix: MoveDirectory on local disk provider no longer throws ArgumentNullException
    • Fix: MoveDirectory on local disk provider will now throw IOException when the destination folder exists
  • FluentStorage.AWS
    • Fix: Blank collections returned by S3 and SQS API calls should not throw NullReferenceException
    • Fix: ListObjects/ListDirectory correctly handle bucket paths and do not truncate the first path character (affects S3 and all S3-compatible providers)
  • FluentStorage.Azure.Blobs
    • Fix: ListObjects/ListDirectory correctly handle bucket paths and do not truncate the first path character
  • FluentStorage.Azure.KeyVault
    • Fix: ListObjects/ListDirectory correctly handle bucket paths and do not truncate the first path character
FluentStorage 8.0.20
  • FluentStorage
    • Change: Use file-scoped namespaces, remove unused using directives and remove unnecessary this keyword usage
    • Change: Remove unnecessary async usage and add missing API docs
  • FluentStorage.AWS
    • Fix: MaxResults loop guard in S3DirectoryBrowser.ListFolderAsync to fix timeout errors in a large S3 bucket
FluentStorage 8.0.19
  • FluentStorage.Git
    • New: Git repository provider that allows users to read/write files within a Git repo using the standard FluentStorage IStore interface
    • New: Connection string support for Git repository provider using git URL prefix
    • New: Git API prefixed with Git* on GitStore
FluentStorage 8.0.17
  • FluentStorage.Azure.Blobs
    • Fix: Azure Blob paths lose their first character due to path handling logic
FluentStorage 8.0.16
  • FluentStorage
    • New: OverwriteByTimestamp and OverwriteByChecksum modes to overwrite files based on timestamp or checksum
    • New: UploadDirectory will return a list of all the per-file progress reports at the end, and will record objects skipped due to rules
    • New: DownloadDirectory will return a list of all the per-file progress reports at the end, and will record objects skipped due to rules
    • New: SkipReason inside each StorageProgress to indicate why the object was skipped
    • New: SkipRule inside each StorageProgress to indicate which rule caused the object to be rejected
    • Change: Rename StorageExistsMode to StorageExists to reduce bloat
    • Fix: UploadDirectory and DownloadDirectory logic that caused it not to overwrite files
  • FluentStorage.SFTP
    • Fix: CreateDirectory does not create the entire directory path
FluentStorage 8.0.14
  • FluentStorage
    • New: GetObjectChecksum API to compute various types of hashes for an object across all providers
    • New: StorageObjectHash object to hold a hash value and easily compare it against any local file or stream
    • New: StorageExistsMode.OverwriteIfChanged mode to only overwrite files if they have changed (length/checksum checks)
    • New: UploadDirectory supports the OverwriteIfChanged mode and only uploads files if the length/checksum mismatches
    • New: DownloadDirectory supports the OverwriteIfChanged mode and only downloads files if the length/checksum mismatches
    • Removed: GetObjectMD5 is removed in favour of GetObjectChecksum
  • FluentStorage.GCP
    • New: Implement fast GetObjectChecksum by using GetObjectAsync API to get MD5 object hash
  • FluentStorage.FTP
    • New: Implement fast GetObjectChecksum by using native FTP commands
  • FluentStorage.SFTP
    • New: Implement fast GetObjectChecksum by using native SSH shell commands to remotely compute an object hash.
    • New: Implement a powerful engine built for Windows and Unix to detects which Shell utilities are available once, then quickly use this information to compute a server-side hash of the file without needing to download it
    • New: Security engine to prevent path-injection and command-injection (based on security engine from FluentFTP)
FluentStorage 8.0.13
  • FluentStorage
    • New: Optimize StoragePath.Combine when combining only 2 path segments (most common use case)
  • FluentStorage.SFTP
    • New: Optimize SetObject & SetBytes APIs to improve transfer performance (4x faster)
    • New: Optimize UploadObject & UploadDirectory APIs to improve transfer performance (2x faster)
    • New: BufferSize set to a default of 128KB to improve transfer performance
    • New: TransferBufferSize setting to change upload/download buffer size
    • Fix: SetObject now correctly handles non-seekable streams
    • Fix: CreateDirectory now creates the entire directory path instead of just the last segment
    • Improve: DirectoryExists uses only one native API call to improve performance
    • Improve: UploadObject now uses native UploadFileAsync API to improve transfer performance
    • Remove: SetLengthOnNewStream as it is no longer supported
FluentStorage 8.0.12
  • FluentStorage
    • New: Add rule-based filtering support in DownloadDirectory and UploadDirectory for all storage providers
    • New: Add rule engine and rules from FluentFTP: ObjectNameRule, ObjectNameRegexRule, DirectoryNameRule, DirectoryNameRegexRule, ExtensionRule
    • New: Add new rule types for path checking: FullPathRule, FullPathRegexRule
    • Fix: Fix all logic issues in rules based on unit test suite
    • Fix: Support case-insensitive extension comparison in ExtensionRule
    • Fix: DownloadObject ensures parent directory exists and fix existance check
    • Fix: DownloadDirectory reports progress on successful transfers too
    • Fix: UploadDirectory reports progress on successful transfers too
    • Paths: StoreObject: Make FullPath instant by computing it at time of construction rather than dynamically
    • Paths: StoreObject: Add Input property to read the raw path given by the provider
  • FluentStorage.FTP
    • Fix: Improve DownloadObject API to have consistant behaviour
  • FluentStorage.SFTP
    • Fix: Improve DownloadObject API to have consistant behaviour
  • FluentStorage.Alibaba
    • Fix: All API should use a single constructor for StoreObject
  • FluentStorage.Tests
    • New: Extensive integration test suite for rule engine under IStore.DirRules class
    • New: Extensive unit test suite for rule engine under RuleTests class
FluentStorage 8.0.10
  • FluentStorage
    • Fix: CreateDirectory will not throw exceptions by default, allowing it to be called on cloud stores
    • Fix: DeleteDirectory has a default implementation for all cloud stores, to delete all objects in a virtual folder
    • Change: DiskStore: DeleteObject will no longer delete objects in a virtual directory
    • Change: MemoryStore: DeleteObject will no longer delete objects in a virtual directory
    • Fix: MemoryStore: ObjectExists normalizes the input path
    • New: MemoryStore: Implement all missing API: OpenRange,