All Versions
Latest Version
Avg Release Cycle
277 days
Latest Release
1853 days ago

Changelog History

  • v20.0.0 Changes

    February 06, 2019

    ๐Ÿš€ Major release with lots of new and exciting features, and numerous fixes by our contributors. Thanks everyone!


    • ๐Ÿ†• New: FTP Server software detection (PureFTPd, VsFTPd, ProFTPD, FileZilla, OpenVMS, WindowsCE, WuFTPd)
    • ๐Ÿ†• New: Detect if the FTP server supports recursive file listing (LIST -R) command using whitelist
    • ๐Ÿ†• New: GetListing will manually recurse through directories if FtpListOption.Recursive is set and server does not support recursion
    • ๐Ÿ†• New: Added LastReply property which returns the last FtpReply recieved from the server.
    • ๐Ÿ†• New: Added new upload option AppendNoCheck to append to a file on the server without checking if it exists (thanks @everbalovas)
    • ๐Ÿ›  Fix: During upload, respond to any error in 5xx series, not just 550 (thanks @stengnath)
    • ๐Ÿ›  Fix: Various fixes to UploadFileAsync based on fixes already implemented in UploadFile


    • ๐Ÿ›  Fix: UploadFilesAsync with errorHandling deletes the entire directory instead of specific files
    • ๐Ÿ›  Fix: Server responds to EPSV with 425 "Data connection failed" but connects with PASV (thanks @ejohnsonTKTNET)
    • ๐Ÿ›  Fix: Use proper async configuration for .NET Async methods (thanks @ejohnsonTKTNET)
    • ๐Ÿ›  Fix: Improve implementation of upload and download resuming in Async methods (thanks @ejohnsonTKTNET)


    • ๐Ÿ›  Fix: UploadFile() or UploadFiles() sometimes fails to create the remote directory if it doesn't exist
    • ๐Ÿ›  Fix: DownloadDataType Binary value ignored on ASCII-configured FTP servers
    • ๐ŸŽ Performance improvement: Added BufferedStream between SslStream and NetworkStream (thanks @Lukazoid)
    • ๐Ÿ›  Fix: When the FTP server sends 550, transfer is received but not confirmed (thanks @stengnath)
    • ๐Ÿ›  Fix: Make Dispose method of FTPClient virtual (thanks @martinbu)
    • ๐Ÿ›  Fix: OpenPassiveDataStream/Async() uses the target FTP host instead of the configured proxy (thanks @rmja)
    • ๐Ÿ›  Fix: FileExists() for Xlight FTP Server (thanks @oldpepper)
    • ๐Ÿ›  Fix: FTPD "550 No files found" when folder exists but is empty, only in PASV mode (thanks @olivierSOW)
    • ๐Ÿ›  Fix: Many unexpected EOF for remote file IOException on Android (thanks @jersiovic)
    • ๐Ÿ›  Fix: Race condition when BeginInvoke calls the callback before the IAsyncResult is added (thanks @Lukazoid)


    • ๐Ÿ›  Fix: Prevent socket poll from hammering the server multiple times per second
    • ๐Ÿ›  Fix: Allow using absolute paths that include drive letters (Windows servers)
    • ๐ŸŽ Performance improvement: Only change the FTP data type if different from required type
    • ๐ŸŽ Performance improvement: Download all files in EOF mode and skip the file size check, unless download progress is required
    • โž• Added all missing async versions of FTP methods to IFtpClient
    • ๐ŸŽ System: Certain core FTP socket handling operations have been changed to improve reliability & performance.


    • ๐Ÿ›  Fix: Fix hang in TLS activation because no timeout is set on the underlying NetworkStream (thanks @iamjay)


    • โž• Added async versions of FTP methods to IFtpClient (thanks @peterfortuin)
    • ๐Ÿ›  Fix: Fixes when ActivePorts is specified in active FTP mode (thanks @ToniMontana)
    • ๐Ÿ›  Fix: Throw OperationCanceledException instead of FtpException when cancellation is requested (thanks @taoyouh)


    • ๐Ÿ›  Fix: Add support for checking if file exists on Serv-U FTP Server
    • ๐Ÿ›  Fix: Make IFtpClient inherit from IDisposable (thanks @repl-andrew-ovens)
    • ๐Ÿ’ป (UWP) Fix: UWP does not allow File.Exists() to run in UI thread (thanks @taoyouh)


    • ๐Ÿ›  Fix: When downloading files in ASCII mode, file length is unreliable therefore we read until EOF
    • ๐Ÿ›  Fix: When upload/download progress is indeterminate, send -1 instead of NaN or Infinity
    • ๐Ÿ›  Fix: NetStream was not assigned in FtpSocketStream for .NET Standard in active FTP mode (thanks @ralftar)
    • ๐Ÿ›  Fix: CurrentDataType was not set for ASCII transfers in DownloadFileAsync/UploadFileAsync (thanks @taoyouh)
    • ๐Ÿ›  Fix: Sometimes FtpSocketStream and FtpDataStream are not disposed in FtpSocketStream.Dispose (thanks @taoyouh)


    • ๐Ÿ†• New Progress reporting for UploadFile & DownloadFile methods via IProgress
    • ๐Ÿ›  Fix: Stream.Position should not be set in UploadFileInternal unless supported


    • ๐Ÿ†• New Task-based async methods for .NET Standard and .NET Fx 4.5 (thanks @taoyouh)
    • ๐Ÿ†• New async methods for UploadFile, DownloadFile, UploadFiles & DownloadFiles (thanks @artiomchi)
    • (UWP) Fix: FileNotFoundException with reference System.Console (thanks @artiomchi)
    • (.NET core) Fix: Thread suspends when calling UploadFile or DownloadFile (thanks @artiomchi)
    • (.NET core) Fix: File download hangs inconsistently when reading data from stream (thanks @artiomchi, @bgroenks96)
    • (.NET core) Fix: Stream does not dispose due to wrong handling of closing/disposing (thanks @artiomchi)
    • ๐Ÿ›  Fix: File upload EOS bug when calling Stream.Read (thanks @bgroenks96, @artiomchi, @taoyouh)
    • ๐Ÿ›  Fix: DownloadFileInternal not recognizing the download data type
      with EnableThreadSafeConnections (thanks @bgroenks96)
    • (Backend) Migrate to a single VS 2017 solution for all frameworks (thanks @artiomchi)
    • (Backend) Continuous Integration using AppVeyor (thanks @artiomchi)


    • โž• Add IFtpClient interface to build unit tests upon main FtpClient class (thanks Kris0)
    • Disposing FtpDataStream reads server reply and closes the underlying stream (thanks Lukazoid)


    • ๐Ÿ†• New SetModifiedTime API to change modified date of a server file in local timezone/UTC
    • โž• Add type argument to GetModifiedTime, allowing for getting dates in UTC/Local timezone
    • ๐Ÿ’ฅ Breaking changes to Async API of GetModifiedTime (addition of type argument)
    • GetModifiedTime and SetModifiedTime now honor the TimeOffset property in FtpClient
    • โž• Add checkIfFileExists to OpenRead, OpenAppend and OpenWrite to skip GetFileSize check
    • ๐Ÿ›  Fix issue where InnerException is null during a file transfer (upload/download)
    • ๐Ÿ‘Œ Improve performance of typical uploads/downloads by skipping the extra file exists check


    • ๐Ÿ›  Fix for CreateDirectory and DirectoryExists to allow null/blank input path values
    • ๐Ÿ›  Fix for GetFtpDirectoryName to return correct parent folder of simple folder paths (thanks ww898)


    • โž• Add argument validation for missing/blank arguments in : Upload, Download, UploadFile(s), DownloadFile(s), GetObjectInfo, DeleteFile, DeleteDirectory, FileExists, DirectoryExists, CreateDirectory, Rename, MoveFile, MoveDirectory, SetFilePermissions, Chmod, GetFilePermissions, GetChmod, GetFileSize, GetModifiedTime, VerifyTransfer, OpenRead, OpenWrite, OpenAppend
    • ๐Ÿ‘ป Disable all async methods on .NET core due to persistant PlatformUnsupported exception (if you need async you are free to contribute a non-blocking version of the methods)


    • ๐ŸŽ Increase performance of GetListing by reading multiple lines at once (BulkListing property, thanks sierrodc)


    • โž• Add support for parsing AS400 listings inside a file (5 fields) (thanks rharrisxtheta)
    • Retry interpreting file listings after encountered invalid date format (thanks rharrisxtheta)
    • Always switch into binary mode when running SIZE command (thanks rharrisxtheta)


    • ๐Ÿ”€ Honor UploadDataType and DownloadDataType in all sync/async cases (thanks rharrisxtheta)
    • ๐Ÿ‘ฎ Force file transfers in BINARY mode for known 0 byte files (thanks rharrisxtheta)
    • ๐Ÿ‘ Allow file transfers in ASCII mode if the server doesn't support the SIZE command (thanks rharrisxtheta)


    • ๐Ÿ›  Fix NullReferenceException when arguments are null during FtpTrace.WriteFunc


    • โœ‚ Remove internal locking for .NET Standard 1.4 version since unsupported on UWP


    • โœ‚ Remove dependency on System.Threading.Thread for .NET Standard 1.4 version (for UWP)


    • ๐Ÿ‘ Allow transferring files in ASCII/Binary mode with the high-level API (UploadDataType, DownloadDataType)


    • โž• Add support for .NET 3.5 and .NET Standard 1.4 (supports Universal Windows Platform 10.0)


    • โž• Add FtpTrace.LogToConsole and LogToFile to control logging in .NET core version


    • โž• Add PlainTextEncryption API to support FTPS servers and plain-text FTP firewalls (CCC command)
    • ๐Ÿ‘ FluentFTP now uses unsafe code to support the CCC command (inside FtpSslStream)
    • If you need a "non unsafe" version of the library please add an issue


    • โž• Add logging for high-level function calls to improve remote debugging (FtpTrace.LogFunctions)
    • โž• Add settings to hide sensitive data from logs (FtpTrace.LogIP, LogUserName, LogPassword)
    • โž• Add RecursiveList to control if recursive listing should be used
    • ๐Ÿ Auto-detect Windows CE and disable recursive listing during DeleteDirectory()
  • v17.4.2 Changes

    June 05, 2017

    ๐Ÿš€ Major release with lots of new and exciting features:


    • โž• Add UploadRateLimit and DownloadRateLimit to control the speed of data transfer (thanks Danie-Brink)


    • ๐Ÿ›  Fix parsing of LinkTarget during GetListing() on Unix FTP servers
    • ๐Ÿ‘Œ Improve logging clarity by removing "FluentFTP" prefix in TraceSource


    • โž• Add MoveFile() and MoveDirectory() to move files and directories safely


    • Automatically verify checksum of a file after upload/download (thanks jblacker)
    • ๐Ÿ”ง Configurable error handling (abort/throw/ignore) for file transfers (thanks jblacker)
    • ๐ŸŒฒ Multiple log levels for tracing/logging debug output in FtpTrace (thanks jblacker)


    • Simplify DeleteDirectory() API - the force and fastMode args are no longer required
    • โœ‚ DeleteDirectory() is faster since it uses one recursive file listing instead of many


    • Split stream API into Upload()/UploadFile() and Download()/DownloadFile()


    • ๐ŸŽ Greatly improve performance of FileExists() and GetNameListing()
    • โž• Add new OS-specific directory listing parsers to GetListing() and GetObjectInfo()
    • ๐Ÿ‘Œ Support GetObjectInfo() even if machine listings are not supported by the server
    • โž• Add existsMode to UploadFile() and UploadFiles() allowing for skip/overwrite and append
    • โœ‚ Remove all usages of string.Format to fix reliability issues caused with UTF filenames
    • ๐Ÿ›  Fix issue of broken files when uploading/downloading through a proxy (thanks Zoltan666)
    • GetReply() is now public so users of OpenRead/OpenAppend/OpenWrite can call it after


    • โž• Add async/await support to all methods for .NET 4.5 and onwards (thanks jblacker)


    • โž• Add UploadFiles() and DownloadFiles() which is faster than single file transfers
    • ๐Ÿ‘ Allow disabling UTF mode using DisableUTF8 API


    • ๐Ÿš€ First .NET Core release (DNXCore5.0) using Visual Studio 2017 project and shared codebase.
    • ๐Ÿ‘Œ Support for .NET 2.0 also added with shims for LINQ commands needed.


    • โž• Add FtpListOption.IncludeSelfAndParent to GetListing()


    • ๐ŸŽ Use streams during upload/download of files to improve performance with large files
  • v16.0.18 Changes

    January 19, 2017

    โž• Add high level API for UploadFile() and DownloadFile()

    ๐Ÿ‘Œ Support FTP proxies, and many fixes related to those.

    โž• Added Serializable attribute to defined Exceptions

    ๐Ÿ›  Fix DeleteDirectory infinite recursion calls when GetListing

    ๐Ÿ›  Fix issues with GetListing() on anonymous login

  • v16.0.12 Changes

    October 29, 2016

    ๐Ÿš€ The is the first release of the FluentFTP library, and the 16th major version of the library since it was started in 2011 by J.P. Trosclair.

    This library was originally called System.Net.FtpClient and hosted on CodePlex. Users of the older library will have to replace all instances of import System.Net.FtpClient to import FluentFTP.

    This version requires .NET Framework 4.0. No other frameworks or libraries are required.