NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #855 most downloaded on NuGet
An FTP and FTPS client for .NET & .NET Standard, optimized for speed. Provides extensive FTP commands, File uploads/downloads, SSL/TLS connections, Directory listing parsing, File hashing/checksums, File permissions/CHMOD, FTP proxies, FXP transfers, UTF-8 support, Async/await support, Powershell support and more. Written entirely in C#, with no external dependencies.
Last release 19 days ago
17 Sep 2026
Release timing varies
gaps range from 8 days to 6 months
Most releases are documented
notes for 49 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
221 releases · first in 2016
New: Clone method allows for cloning an FtpClient connection with all settings copied
Clone method allows for cloning an FtpClient connection with all settings copiedInternetProtocol property which returns the current protocol used (IPV4/IPV6)Status property which returns the current FtpClientState flags (advanced use only)AutoConnect/AutoConnectAsync now correctly configure Azure FTP serversFix: ConnectAsync correctly honors ConnectTimeout and TimeoutException is correctly thrown
ConnectAsync correctly honors ConnectTimeout and TimeoutException is correctly thrownConnect/ConnectAsync to ensure ConnectTimeout is honoredOne column per quarter.
New: Username/password authentication for SOCKS5 proxy connections
ConnectionType for all proxy typesFtpProxyProfileConnectProxyHttp11, ConnectProxySocks4, ConnectProxySocks4a, ConnectProxySocks5)SocksProxyException to FtpProxyExceptionProxyInfo to FtpProxyProfile and rename membersChange: Rename enum FtpFileSystemObjectType to FtpObjectType
FtpFileSystemObjectType to FtpObjectTypeFtpFileSystemObjectSubType to FtpObjectSubTypeUpload to UploadBytes and UploadStream instead of overloadingDownload to DownloadBytes and DownloadStream instead of overloadingAggregateException when an error occuring during resuming a file upload (.NET 4.5+)Fix: Error when downloading large files through SOCKS4 or SOCKS4a proxy (thanks fire-lizard)
Fix: Disable SSL Buffering in .NET 6 as it was in .NET 5
Major: Added support for SOCKS4 proxy servers using the FtpClientSocks4Proxy client class (thanks fire-lizard)
FtpClientSocks4Proxy client class (thanks fire-lizard)FtpClientSocks4aProxy client class (thanks fire-lizard)New: Detect Rumpus FTP servers for Mac (allows for future server-specific handling)
DisconnectWithShutdown property to configure shutdown signal on disconnectUngracefullDisconnect to DisconnectWithQuitFix: IOException in synchronous methods when AUTH TLS is rejected (thanks yatlor)
Fix: For FileZilla FTP Server, TLS socket would be incorrectly closed (thanks michael-hoedl)
Change: Remove Obsolete from all OpenRead/OpenWrite/OpenAppend API as it is not planned for deletion
Obsolete from all OpenRead/OpenWrite/OpenAppend API as it is not planned for deletionFix: z/OS: GetListing: Handle large file sizes reported in Used column (thanks FanDjango)
Fix: SetWorkingDirectoryAsync doesn't set working directory due to missing cache invalidation (thanks FanDjango)
SetWorkingDirectoryAsync doesn't set working directory due to missing cache invalidation (thanks FanDjango)FEAT replies to support ProFTPD capability reporting (thanks FanDjango)CancellationTokenSource created during ConnectAsync (thanks jnyrup)ArgumentNullException and ArgumentOutOfRangeException (thanks jnyrup)New: Detect Titan FTP servers (allows for future server-specific handling)
OpenRead/OpenWrite/OpenAppend API and keep only 2 methods eachOpenRead/OpenWrite/OpenAppend API as obsolete with warnings and recommend high level APIChange: Restore the older OpenRead API to prevent breaking older projects that depend on it (thanks FanDjango)
OpenRead API to prevent breaking older projects that depend on it (thanks FanDjango)New: GetZOSFileSize is now removed and superceeded by GetFileSize which handles z/OS servers
GetZOSFileSize is now removed and superceeded by GetFileSize which handles z/OS serversIsRoot, GetFileSizeOpenRead API no longer supports checkIfFileExists argument (thanks FanDjango)UploadFilesAsync: Fixed IBM MVS File uploading path calculation (thanks FanDjango)New: Detect PyFtpdLib FTP servers (allows for future server-specific handling)
FileExists for z/OS: better no SIZE, no MDTM on non HFS files (thanks FanDjango)DownloadFile for z/OS: SetDataType directly before the RETR command (thanks FanDjango)IsAuthenticated is not updated when calling ConnectAsync (thanks datvm)SetDataType is called internally to improve performance (thanks FanDjango)Unix is also mentioned in welcome message (thanks FanDjango)Fix: z/OS GetFileSize: Ignore SIZE capability even if advertised by server as pointless (thanks FanDjango)
Fix: z/OS GetListing: Path can be null causing an exception (thanks FanDjango)
CWD to the correct folder of a non-RECFM=U PDS (thanks FanDjango)New: Support for connecting to FTP/FTPS servers via a SOCKS5 proxy (thanks bjth)
New: GetZOSFileSize APIs to get file size of IBM z/OS file system objects (thanks FanDjango)
GetZOSFileSize APIs to get file size of IBM z/OS file system objects (thanks FanDjango)GetZOSListRealm APIs to get realm of IBM z/OS servers (thanks FanDjango)AutoConnect detects rejected certificates on connection and raises FtpInvalidCertificateException (thanks FanDjango)FtpListOption.ForceList is not being honored by GetListing and machine listings are used instead (thanks FanDjango)GetListing regression causing many untrue parse fail warnings (thanks FanDjango)GetObjectInfo is overwriting Modified date of a FtpListItem if the consecutive MDTM command fails (thanks Dylan-DutchAndBold)CWD using Execute API does not invalidate internal CWD cache (thanks FanDjango)Fix: UploadFile fails to upload in FtpRemoteExists.Resume mode even if stream is seekable
UploadFile fails to upload in FtpRemoteExists.Resume mode even if stream is seekableFix: AutoConnect loads the newly detected FtpProfile to update properties & encryption
AutoConnect loads the newly detected FtpProfile to update properties & encryptionFtpEncryptionMode.Auto mode and FTPS connection failsFix: AutoDetect correctly recommends FtpEncryptionMode.None if FTPS connection failed
AutoDetect correctly recommends FtpEncryptionMode.None if FTPS connection failedAutoDetect crashes because attempting to read socket type after disconnectedMajor: AutoDetect does not cycle through data connection types during connection as it is irrelevant
AutoDetect does not cycle through data connection types during connection as it is irrelevantAutoDetect calculates a data connection type after connection succeeds (EPSV or PASV)Fix: ConnectAsync now correctly creates a FTP server-specific handler to match Connect behaviour
ConnectAsync now correctly creates a FTP server-specific handler to match Connect behaviourMajor: AutoConnect takes far fewer connection attempts due to improvements in connection handling
Automatic connection
AutoConnect takes far fewer connection attempts due to improvements in connection handlingAutoConnect and AutoDetect are much faster and smarter and only try each setting once if possibleAutoDetect only tries Explicit and Implicit FTPS once and then falls back to plaintext FTPAutoDetect only tries UTF-8 and never ASCII because most UTF-8 servers don't advertise itAutoDetect verifies if the server supports UTF-8 and updates the FtpProfile accordinglyFtpProfile code generation adds a warning message if the encoding mode is unverifiedAutoConnectAsync now uses true asynchronous connection backed by new AutoDetectAsyncAutoConnect now auto computes an FTP port unless a non-standard port is already setAutoConnect uses the main FtpClient connection rather than creating one clone per attemptAutoConnect remains connected to the first working profile rather than connecting twice on successAutoConnect reuses the same connection for FTPS and FTP rather than connecting againAutoDetect if original connection is blankAutoConnect and AutoDetect will now throw exceptions for permanent failures (bad host/credentials)ConnectAsync now correctly resets the state flags to match Connect behaviourPort now correctly calculates the default port 21 when using FtpEncryptionMode.AutoAppending and resuming uploads
FtpLocalExists.Append is now renamed to FtpLocalExists.ResumeFtpRemoteExists.Append is now renamed to FtpRemoteExists.ResumeFtpRemoteExists.Append into two properties with distinct behaviour (Resume and AddToEnd)UploadFile and UploadFileAsync to support appending and resuming of uploadsUploadFile always sets the length of the remote file stream before uploading, appending or resumingUploadFile skips uploading in Resume mode if local and remote file are equal lengthUploadFile based on fixes in UploadFileAsyncMachine listings
GetListing prefers using Machine Listings over LIST command, unless a custom list parser is setListingParser property is updated according to auto-detected parser during Connect and ConnectAsyncDeleteDirectory and DereferenceLink methods no longer use ForceList and so prefer using Machine ListingsFile hashing
GetChecksum is the only recommended approachGetChecksum now prints function call logs and sanitizes the input pathGetChecksum switches to the first preferred hash algorithm for HASH command if no algorithm is specifiedGetChecksum validates if the required algorithm is unsupported and throws FtpHashUnsupportedExceptionGetChecksum validates if hashing is unsupported by the server and throws FtpHashUnsupportedExceptionGetChecksumAsync now takes the cancellation token last to follow conventions (argument reorder)SetHashAlgorithm now only modifies the hash algorithm if it has changedPath sanitization
GetWorkingDirectory always sanitizes the returned working path directoryPath improvements
GetWorkingDirectory is now extremely fast and caches the working dir path for subsequent callsFileExists supports checking name listings for Windows NT servers which use invalid slashes./ and instead return /Other improvements
IAsyncResult pattern have been removed (outdated since 2012)UploadFileUploadFile and DownloadFileGetNameListing to print results of name listing as verbose logs, similar to GetListingGetFileSize and GetFileSizeAsync to support a configurable return value if the file does not existFtpFolderNameRule now supports startSegment to skip checking root directory folder namesFtpFolderNameRegexRule now supports startSegment to skip checking root directory folder namesNew: Add support for IsAuthenticated property which enables detection of FTP connection and authentication
IsAuthenticated property which enables detection of FTP connection and authenticationCompletionCode is always null-checked to fix edge cases and comply with existing implementationEPSV command (thanks jsantos74)Fix file path calculation when uploading files to IBM zOS running MVS (thanks arafuls)
Major: Refactor and cleanup helpers & extension methods
FtpTrace to FluentFTP.HelpersFtpListParser to FluentFTP.HelpersFluentFTP.Helpers to gain access to FTP extension methodsinternal to prevent external accessSocketLocalIp, SocketLocalEndPoint, SocketRemoteEndPoint (thanks daviddenis-stx)New: Ability to block certain server ports from being used during passive FTP connection (PASV/EPSV)
PassiveBlockedPorts and PassiveMaxAttempts properties to configure passive blocked portsFix: Add support for another server specific string to detect if file exists
ValidateCertificateRevocation by defaultFix: DownloadFile should fail if directory path is passed in localPath
DownloadFile should fail if directory path is passed in localPathLastReply is not set when using async methodsSystem.Linq.Async and disable GetListingAsyncEnumerableFix: Use .NET Core API for .NET 5 builds to fix various networking and connectivity issues
Fix: Do not force users to Connect if capabilities are not loaded (only force if Capabilities are read before connecting)
Connect if capabilities are not loaded (only force if Capabilities are read before connecting)Fix: Conditionally hard-abort AutoConnect only if the credentials were incorrect
AutoConnect only if the credentials were incorrectNew: LogToFile and LogToConsole are now available on .NET Framework / .NET 5.0
LogToFile and LogToConsole are now available on .NET Framework / .NET 5.0Capabilities & HashAlgorithms are returned if they are loaded regardless of connection statusFix: Prevent Capabilities & HashAlgorithms from causing sync-over-async path
Capabilities & HashAlgorithms from causing sync-over-async pathNullReferenceException during UploadFile if the error message is unknownAutoConnect, it does not hard abortSslBuffering is enabledNew: Support for .NET 5.0 platform
IAsyncEnumerable pattern in .NET Standard 2.0+ and .NET 5.0 (thanks hez2010)GetListingAsync introduced: GetListingAsyncEnumerableNothing published for this version
Fix: URI ports not being respected when Uri constructor used (thanks julian94)
332 Need account for login response during FTP client authorization (thanks novak-as)restartPosition in Download method to match FtpClient method (thanks AdamLewisGMSL)Fix: Honor custom parsers if server-specific handler is used
Fix: Create server-specific handler if a custom handler has not been set (thanks Adhara3)
Change: Breaking changes to the TimeConversion property.
TimeConversion and TimeZone)ServerTime, LocalTime and UTC)LocalTimeZone)GetListing honors the time conversion settings of the active clientGetModifiedDate honors the time conversion settings of the active clientSetModifiedDate honors the time conversion settings of the active clientListingCustomParser on the client)FtpParser.Legacy will no longer work)GetModifiedTimeAsyncTimeConversion property.TimeOffset property, which has been replaced by TimeZoneFix: "The connection was terminated before a greeting could be read"
Platform: Add support for .NET Standard 2.1
System.Net.Security from version 4.3.0 to 4.3.2 to fix security issuesAutoDetect/AutoConnectUploadDirectory fails for some files with "Unable to read data from the transport connection" (thanks manuelxmarquez)UploadFile/UploadFileAsync/DownloadFile/DownloadFileAsync methodsFix: Uncatchable NullReferenceException is occasionally thrown from ConnectAsync
ConnectAsyncNew: Automatic FTPS connection mode: FtpEncryptionMode.Auto which connects in FTP and attempts to upgrade to FTPS
FtpEncryptionMode.Auto which connects in FTP and attempts to upgrade to FTPS
IsEncrypted property to check if FTPS encryption is currently active for this connectionValidateCertificateRevocation property was not being honored in async version (thanks kolorotur)Fix: Ensure file is retried sucessfully when first upload/download fails with an IOException (thanks manuelxmarquez)
IOException (thanks manuelxmarquez)
FtpClient is provided (thanks manuelxmarquez)Nothing published for this version
New: LocalFileBufferSize property to control size of file buffer during local file I/O
LocalFileBufferSize property to control size of file buffer during local file I/ONew: UploadDirectoryDeleteExcluded property to control if excluded files are deleted during Upload (thanks philippjenni)
UploadDirectoryDeleteExcluded property to control if excluded files are deleted during Upload (thanks philippjenni)
DownloadDirectoryDeleteExcluded property to control if excluded files are deleted during Download (thanks philippjenni)UploadDirectory (once file transfer begins it cannot be cancelled)DownloadDirectory (once file transfer begins it cannot be cancelled)TransferDirectoryGetListingFtpClient that are not meant to be exposedIFtpClient with the latest set of public properties that are meant to be exposedFix: Downloading or uploading a directory can generate incorrect local paths
Fix: Downloading or uploading a directory can generate incorrect local paths
LoadProfile API so it can be called by the generated code from AutoDetectNew: ListingDataType property to get file listings in ASCII/Binary
ListingDataType property to get file listings in ASCII/Binary
DownloadZeroByteFiles property to control if zero-byte files should be downloaded or skippedNew: All server-specific handlers moved to dedicated classes that extend FtpBaseServer
FtpBaseServer
FtpBaseServerNew: Tracking progress with FXP transfers is supported for all transfer modes
TransferredBytes in FtpProgress class (thanks Adhara3)FXPProgressInterval property to control how often FXP progress reports are sentTransferFileFXPInternal because its an internal transfer method and not to be used directlyFix: FtpFileExtensionRule was failing to compare extensions unless they were prefixed with a dot
FtpFileExtensionRule was failing to compare extensions unless they were prefixed with a dotNew: GetChecksum allows you to specify a hash algorithm to be run on the server if supported
GetChecksum allows you to specify a hash algorithm to be run on the server if supported
GetChecksum has special support for switching the server-side algorithm for HASH command supportFix: Incorrectly formatted string returned by utility method TransferSpeedToString
TransferSpeedToStringYour coding agent can read these notes before it upgrades. Set up the MCP server →