Alternatively, it would be nice if calling cancel and the transfer actually cancels (eg connection is not idle or race condition allowed put()/get() to finish before calling cancel) would throw an FTPTransferCancelledException to be caught, that way one could know that there is an incomplete transfer somewhere.