- Fix: Safely absorb TimeoutException thrown after the file has fully uploaded/downloaded
- New: Progress reporting for synchronous methods
Upload,Download,UploadFileandDownloadFileare now sent via delegates - Fix: Correctly send progress for synchronous methods and retain
IProgressfor async methods
- Fix: Correctly assume Unix file listing parser for SunOS & Solaris servers
- Fix: Safely absorb TimeoutException thrown after the file has fully uploaded/downloaded
- New: Support detection of Sun OS Solaris FTP OS and server (allows for server specific commands)
- Fix: UploadFile fails when destination folder is empty on SunOS (550 error)
- Fix: Unable to upload files to OpenVMS servers if path contains numeric characters
- Fix: Assume FTP commands supported by OpenVMS HGFTP server if FEAT not supported
- FiX: Improve detection of OpenVMS absolute paths
- Fix:
Connect&ConnectAsyncthrow ArgumentException when passing an incompleteFtpProfile
- New: Auto-detect the correct FTP listing parser when SYST command fails (IIS, Azure, OpenVMS)
- New: Assume FTP commands supported by OpenVMS HGFTP server
- FiX: Support edge case for OpenVMS absolute paths (directive can be alpha-numeric)
- New: Improved transfer rate throttling when using an upload/download speed limit (thanks wakabayashik)
- New: Support detection of XLight FTP server software (allows for server specific commands)
- New: Partial support for getting directory listing using STAT command (
GetListingsupports newFtpListOption.UseStat) - Fix:
GetFileSizealways returns 0 instead of correct file size (thanks RadiatorTwo)
- Fix:
FileExistsandFileExistsAsyncsupport switching to binary mode for servers that need it
- Fix: Error using BlueCoat proxy to an FTP server on a port other than port 21
- Fix: Error using UserAtHost proxy to an FTP server on a port other than port 21
- New: Change
CapabilityAPI to return a list instead of bitwise enum (to support more than 32 distinct capabilities) - New: Change custom parsers to take capabilities as a list instead of bitwise enum (to match client implementation)
- New: Support detection of FTP2S3 gateway server software (allows for server specific commands)
- New: Support detection of server-specific capabilities of Serv-U FTP Gateway
- New: Support
RMDAcommand to quickly and recursively delete a directory from Serv-U FTP Gateway
- Fix: Improve performance of
GetFileSizeto only switch to Binary for servers that require it - Fix: Ensure data type (ASCII/Binary) is correctly set during
GetFileSizefor servers that require it - Fix: Ensure data type (ASCII/Binary) is correctly set for cloned connections
- Fix: Ensure data type (ASCII/Binary) is correctly set during
GetListingandGetNameListing - Fix: Reset server detection state flags whenever we connect to a server, to allow for reuse of
FtpClient - Fix: Copy server detection state flags to cloned connections to improve performance
- Fix: Retry
GetListingif temporary error "Received an unexpected EOF or 0 bytes from the transport stream"
- Fix: Prefer using Passive/Active modes rather than Enhanced Active/Passive during auto-detection
- Fix: Some FTP servers do not open a port when listing an empty folder with
GetNameListing - Fix: Hard catch and suppress all exceptions during disposing to solve all random exceptions
- New: Automatic FTP connection negotiation using
AutoConnect() - New: Automatic detection of working FTP connection settings using
AutoDetect() - New: C# code generation of working connection settings using
FtpProfile.ToCode() - New: Support more capability detection commands: EPSV, CPSV, NOOP, CLNT, SSCN, SITE commands for ProFTPd
- New: Improve transfer performance by only attempting EPSV once and then never using it again for that connection
- New: Support MKDIR & RMDIR commands specially for ProFTPd to quickly create and delete a directory on the server-side
- New: Support PRET command before downloading or uploading files for servers like ProFTPd & DrFTPd
- New: Support detection of BFTPd server software (allows for server specific commands)
- Fix: When uploading files in
FtpExists.NoCheckmode, file size check should not be done - Fix: Some FTP servers do not open a port when listing an empty folder (thanks Mortens4444)
- Fix:
OpenReadwithEnableThreadSafeDataConnectionsalways transfers in ASCII (thanks ts678) - Refactor: Delete legacy static methods:
OpenRead,OpenWrite,OpenAppend(dynamic versions still exist) - Refactor: Move
CalcChmodfromFtpClienttoFtpExtensions(as part of repository cleanup task)
- Fix: Async methods do not work with Active FTP mode and SSL/encryption (thanks Mortens4444)
- Fix: For OpenVMS absolute paths may not contain slashes but are still absolute (3rd revision)
- Fix: Divide-by-zero exceptions while calculating progress of file uploads/downloads
- Fix: Supress all exceptions when Disposing the underlying FtpSocketStream
- Fix: Received an unexpected EOF or 0 bytes from the transport stream (thanks mikemeinz)
- Fix:
UploadFile()progress callback is not called if the file already exists on the server - (.NET core) Fix:
Connect()method sometimes causes the thread to hang indefinitely (thanks radiy) - Fix: Regression of #288 where upload hangs with only a few bytes left (thanks cw-andrews)
- New:
FtpAuthenticationExceptionfor authentication errors (thanks erik-wramner) - New: Added support to detect Homegate FTP Server
- New: SSL Buffering is now switchable via the
SslBufferingparameter - Fix: SSL Buffering is automatically disabled when using FTP proxies, and enabled in all other cases
- Fix: Revert PR #383 as it was causing regression issues in SSL connectivity
- Fix: Disable automatic IP correction to fix connectivity issues via BlueCoat proxy servers (thanks CMIGIT)
- Refactor: Rename
FtpClientUserAtHostProxyBlueCoattoFtpClientBlueCoatProxy - Fix: For OpenVMS absolute paths may not contain slashes but are still absolute (2nd revision) (thanks tonyhawe)
- Fix: Detect file existence string
"Can't find file"to fix FileExists check on some servers (thanks reureu) - Fix: Feature parity between
FileExistsandFileExistsAsyncmethods, added support for FtpReply 550 check (thanks reureu) - Fix: Feature parity between
UploadFileandUploadFileAsyncmethods, added support for AppendNoCheck handling (thanks reureu)
- New: Get detailed progress information for uploads/downloads via the
FtpProgressobject (thanks n0ix) - New: Get transfer speed and ETA (estimated time of arrival) for uploads/downloads (thanks n0ix)
- Fix: Files were uploaded in Write mode instead of Append mode when the exists mode is
AppendNoCheckand we couldn't read the offset position (thanks @everbalovas) - Fix: Swap
SslStreamandBufferedStreamso proxied connections withFtpClientHttp11Proxyare to connect (thanks @rmja)
- New: Additional FTP Server software detection (HP NonStop/Tandem, GlobalScape EFT, Serv-U, Cerberus, CrushFTP, glFTPd)
- New: Assume capabilities for servers that don't support FEAT (wuFTPd)
- Fix:
FileExistsreturns false if name listing is used and server lists filenames with the path - Fix: For OpenVMS absolute paths may not contain slashes but are still absolute
- Fix: For
Download()methodsrestartPositionshould not be mandatory
- New: Ability to cancel all async methods via
CancellationToken(thanks WolfspiritM) - New:
ReadTimeoutis now honored by all async methods (thanks WolfspiritM) - New: FTP Server operating system detection (Windows, Unix, VMS, IBM/OS400)
- (.NET core) Fix: GetListing blocking with no timeout (thanks WolfspiritM)
- (.NET core) Fix async methods by not using the the async read function (thanks WolfspiritM)
- New: Ability to resume a download via
existsModeonDownloadFile()andDownloadFiles()(thanks n0ix) - New: Ability to turn off checking for server capabilities using FEAT command (thanks nhh-softwarehuset)
- Fix: Add workaround if a server advertises a non-routeable IP in PASV Mode (thanks n0ix)
- Fix: Recursive directory deletion tries to delete the same file twice (because GetListing is also recursive)
- New:
OnLogEventcallback to get logs in the context of indivivdual FtpClient connections - Fix: All logging is done in the context of an
FtpClientand then passed toFtpTracelisteners - Signature for custom list parsers has changed,
FtpClientargument added to the end
- 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:
GetListingwill manually recurse through directories ifFtpListOption.Recursiveis set and server does not support recursion - New: Added
LastReplyproperty which returns the lastFtpReplyrecieved from the server. - New: Added new upload option
AppendNoCheckto 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
UploadFileAsyncbased on fixes already implemented inUploadFile
- Fix:
UploadFilesAsyncwitherrorHandlingdeletes 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()orUploadFiles()sometimes fails to create the remote directory if it doesn't exist - Fix:
DownloadDataTypeBinary value ignored on ASCII-configured FTP servers - Performance improvement: Added
BufferedStreambetweenSslStreamandNetworkStream(thanks stengnath) - Fix: When the FTP server sends 550, transfer is received but not confirmed (thanks stengnath)
- Fix: Make
Disposemethod ofFTPClientvirtual (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 stengnath)
- Fix: Many unexpected EOF for remote file
IOExceptionon Android (thanks @jersiovic) - Fix: Race condition when
BeginInvokecalls the callback before theIAsyncResultis added (thanks stengnath)
- 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
ActivePortsis specified in active FTP mode (thanks @ToniMontana) - Fix: Throw
OperationCanceledExceptioninstead ofFtpExceptionwhen cancellation is requested (thanks taoyouh)
- Fix: Add support for checking if file exists on Serv-U FTP Server
- Fix: Make
IFtpClientinherit fromIDisposable(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:
NetStreamwas not assigned inFtpSocketStreamfor .NET Standard in active FTP mode (thanks @ralftar) - Fix:
CurrentDataTypewas not set for ASCII transfers inDownloadFileAsync/UploadFileAsync(thanks taoyouh) - Fix: Sometimes
FtpSocketStreamandFtpDataStreamare not disposed inFtpSocketStream.Dispose(thanks taoyouh)
- New Progress reporting for
UploadFile&DownloadFilemethods viaIProgress - Fix:
Stream.Positionshould not be set inUploadFileInternalunless 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:
FileNotFoundExceptionwith referenceSystem.Console(thanks artiomchi) - (.NET core) Fix: Thread suspends when calling
UploadFileorDownloadFile(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:
DownloadFileInternalnot recognizing the download data type withEnableThreadSafeConnections(thanks bgroenks96) - (Backend) Migrate to a single VS 2017 solution for all frameworks (thanks artiomchi)
- (Backend) Continuous Integration using AppVeyor (thanks artiomchi)
- Add
IFtpClientinterface to build unit tests upon mainFtpClientclass (thanks Kris0) - Disposing
FtpDataStreamreads server reply and closes the underlying stream (thanks Lukazoid)
- New
SetModifiedTimeAPI 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) GetModifiedTimeandSetModifiedTimenow honor theTimeOffsetproperty inFtpClient- Add
checkIfFileExiststoOpenRead,OpenAppendandOpenWriteto skipGetFileSizecheck - Fix issue where
InnerExceptionis null during a file transfer (upload/download) - Improve performance of typical uploads/downloads by skipping the extra file exists check
- Fix for
CreateDirectoryandDirectoryExiststo allow null/blank input path values - Fix for
GetFtpDirectoryNameto 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
PlatformUnsupportedexception (if you need async you are free to contribute a non-blocking version of the methods)
- Increase performance of
GetListingby 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
UploadDataTypeandDownloadDataTypein 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
NullReferenceExceptionwhen arguments are null duringFtpTrace.WriteFunc
- Remove internal locking for .NET Standard 1.4 version since unsupported on UWP
- Remove dependency on
System.Threading.Threadfor .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.LogToConsoleandLogToFileto control logging in .NET core version
- Add
PlainTextEncryptionAPI 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
RecursiveListto control if recursive listing should be used - Auto-detect Windows CE and disable recursive listing during
DeleteDirectory()
- Add
UploadRateLimitandDownloadRateLimitto control the speed of data transfer (thanks Danie-Brink)
- Fix parsing of
LinkTargetduringGetListing()on Unix FTP servers - Improve logging clarity by removing "FluentFTP" prefix in TraceSource
- Add
MoveFile()andMoveDirectory()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 - theforceandfastModeargs are no longer required DeleteDirectory()is faster since it uses one recursive file listing instead of many- Remove .NET Standard 1.4 to improve nuget update reliability, since we need 1.6 anyway
- Split stream API into
Upload()/UploadFile()andDownload()/DownloadFile()
- Greatly improve performance of
FileExists()andGetNameListing() - Add new OS-specific directory listing parsers to
GetListing()andGetObjectInfo() - Support
GetObjectInfo()even if machine listings are not supported by the server - Add
existsModetoUploadFile()andUploadFiles()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 ofOpenRead/OpenAppend/OpenWritecan call it after
- Add async/await support to all methods for .NET 4.5 and onwards (thanks jblacker)
- Support for .NET Standard 1.4 added.
- Add
UploadFiles()andDownloadFiles()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.IncludeSelfAndParenttoGetListing
- Use streams during upload/download of files to improve performance with large files
- Support for uploading/downloading to Streams and byte[] with
UploadFile()andDownloadFile()
- Added high-level
UploadFile()andDownloadFile()API. Fixed some race conditions.
- Added support for FTP proxies using HTTP 1.1 and User@Host modes. (thanks L3Z4)