Index: src/wp-admin/includes/class-wp-filesystem-ftpext.php
===================================================================
--- src/wp-admin/includes/class-wp-filesystem-ftpext.php	(revision 35918)
+++ src/wp-admin/includes/class-wp-filesystem-ftpext.php	(working copy)
@@ -322,37 +322,65 @@ class WP_Filesystem_FTPext extends WP_Fi
 		if ( !empty($filelist) )
 			foreach ( $filelist as $delete_file )
 				$this->delete( trailingslashit($file) . $delete_file['name'], $recursive, $delete_file['type'] );
 		return @ftp_rmdir($this->link, $file);
 	}
 
 	/**
 	 * @access public
 	 *
 	 * @param string $file
 	 * @return bool
 	 */
 	public function exists( $file ) {
 		$path = dirname( $file );
 		$filename = basename( $file );
+		$hidden = ( '.' === substr( $filename, 0, 1 ) );
 
-		$file_list = @ftp_nlist( $this->link, '-a ' . $path );
+		// Attempt an NLST, conditionally including -a if it's a hidden file
+		$file_list = @ftp_nlist( $this->link, ( $hidden ? '-a ' : '' ) . $path );
 		if ( $file_list ) {
 			$file_list = array_map( 'basename', $file_list );
+			if ( in_array( $filename, $file_list ) ) {
+				return true;
+			}
 		}
 
-		return $file_list && in_array( $filename, $file_list );
+		// For hidden files, perform a few extra checks for compat.
+		if ( $hidden ) {
+			// Try LIST -a
+			$file_list = @ftp_rawlist( $this->link, '-a ' . $file );
+			if ( empty( $file_list ) && $this->is_dir( $file ) ) {
+				// File is an empty directory.
+				return true;
+			}
+			// Empty list = no file, so invert.
+			if ( ! empty( $file_list ) ) {
+				return true;
+			}
+
+			// Try NLIST without -a, some servers will return hidden files this way which don't get caught by LIST -a
+			$file_list = @ftp_nlist( $this->link, $path );
+			if ( $file_list ) {
+				$file_list = array_map( 'basename', $file_list );
+				if ( in_array( $filename, $file_list ) ) {
+					return true;
+				}
+			}
+		}
+
+		return false;
 	}
 
 	/**
 	 * @access public
 	 *
 	 * @param string $file
 	 * @return bool
 	 */
 	public function is_file($file) {
 		return $this->exists($file) && !$this->is_dir($file);
 	}
 
 	/**
 	 * @access public
 	 *
