public static async Task <FtpListItemViewModel> FromFtpListItemAsync(FluentFTP.FtpListItem item) { var result = new FtpListItemViewModel { Source = item, FileName = item.Name, FileSize = GetSizeString(item.Size), }; switch (item.Type) { case FluentFTP.FtpFileSystemObjectType.Directory: result.Icon = await GetIconOfFolderAsync(); break; case FluentFTP.FtpFileSystemObjectType.File: result.Icon = await GetIconOfFileAsync(Path.GetExtension(item.FullName)); break; case FluentFTP.FtpFileSystemObjectType.Link: result.Icon = null; break; } return(result); }
private void ProcessFile(FluentFTP.FtpListItem item, Data.Models.FtpFolder folder) { Data.Models.FtpFile file = null; lock (_locker) file = filesList.FirstOrDefault(f => f.FullName == item.FullName.Trim()); if (null == file) { FtpFileService.Create(new Data.Models.FtpFile { Extension = System.IO.Path.GetExtension(item.Name), FileDate = item.Modified, FileSize = item.Size, FolderId = folder.Id, FullName = item.FullName, ServerId = Server.Id, ShortName = item.Name }); } else { file.Extension = System.IO.Path.GetExtension(item.Name); file.FileDate = item.Modified; file.FileSize = item.Size; file.FolderId = folder.Id; file.FullName = item.FullName; file.ServerId = Server.Id; file.ShortName = item.Name; FtpFileService.Update(file); } }
/// <summary> /// 删除指定的项目并在删除前要求用户确认。 /// </summary> /// <param name="item">要删除的项目</param> /// <returns>是否已删除项目</returns> private async Task <bool> DeleteItemAsync(FluentFTP.FtpListItem item) { await ftpSemaphore.WaitAsync(); try { ContentDialog dialog = new ContentDialog() { Content = string.Format("你确定要删除{0}吗?", item.Name), PrimaryButtonText = "是", CloseButtonText = "否" }; var result = await dialog.ShowAsync(); progressBar.Visibility = Visibility.Visible; progressBar.IsIndeterminate = true; if (result != ContentDialogResult.Primary) { return(false); } switch (item.Type) { case FluentFTP.FtpFileSystemObjectType.Directory: await client.SetWorkingDirectoryAsync(Path.GetDirectoryName(item.FullName)); await client.DeleteDirectoryAsync(item.Name); break; case FluentFTP.FtpFileSystemObjectType.File: await client.SetWorkingDirectoryAsync(Path.GetDirectoryName(item.FullName)); await client.DeleteFileAsync(item.Name); break; default: throw new NotImplementedException("不支持删除除文件夹和文件以外的类型"); } progressBar.Visibility = Visibility.Collapsed; ContentDialog resultDialog = new ContentDialog() { Content = string.Format("已经成功删除{0}。", item.Name), CloseButtonText = "确定" }; await resultDialog.ShowAsync(); } catch (Exception ex) { ContentDialog exceptionDialog = new ContentDialog() { Content = string.Format("遇到未知错误。错误信息:{0}", ex.Message), CloseButtonText = "确定" }; await exceptionDialog.ShowAsync(); } finally { progressBar.Visibility = Visibility.Collapsed; ftpSemaphore.Release(); } return(true); }
internal FtpStoreEntry(string path, FluentFTP.FtpListItem fileInfo) { _fileInfo = fileInfo ?? throw new ArgumentNullException(nameof(fileInfo)); _path = path ?? throw new ArgumentNullException(nameof(path)); }
public override DateTime GetModifiedDateTime(string remotePath) { FluentFTP.FtpListItem item = _client.GetObjectInfo(remotePath); return(item.Modified); //Created does not seem to work properyly during tests }
public virtual FileInfo DownloadFile(string url, string filename) { if (string.IsNullOrWhiteSpace(url)) { throw new ArgumentNullException(nameof(url)); } if (string.IsNullOrWhiteSpace(RequestEmail) || !RequestEmail.Contains('@') || RequestEmail.Length < 10) { Log.WriteLine("Internal error. Cannot request FTP content because no contact email is provided.", LogLevel.Error); throw new InvalidOperationException("No valid requesting contact email provided. Please set the RequestEmail to continue. Cant comply."); } FileInfo localFile = new FileInfo(Path.Combine(CacheDirectory, filename)); if (!localFile.Directory.Exists) { localFile.Directory.Create(); } if (OfflineMode) { localFile.Refresh(); if (!localFile.Exists) { throw new FileNotFoundException("The downloaded file cannot be located. Application is in offline mode."); } Log.WriteLine("Offline mode. No file download for %@. Cached file size: %@ bytes", LogLevel.Message, localFile.Name, localFile.Length.ToString("N0")); return(localFile); } if (FtpClient == null) { FtpClient = new FluentFTP.FtpClient(PublicFtpHostname, PublicFtpPort, new System.Net.NetworkCredential("anonymous", RequestEmail)); FtpClient.ConnectTimeout = 7000; FtpClient.DataConnectionConnectTimeout = 7000; FtpClient.DataConnectionReadTimeout = 10000; FtpClient.ReadTimeout = 7000; } else { Log.WriteLine("Reusing existing FTP connection to ftp://%@@%@:%@", LogLevel.Debug, FtpClient.Credentials.UserName, PublicFtpHostname, PublicFtpPort.ToString()); } int tryIndex = 0; int maxTries = 10; int tryDelayFormulaBase = 2; bool abortLoop = false; while (!FtpClient.IsConnected) { try { if (tryIndex >= maxTries) { abortLoop = true; throw new IOException("Cannot connect to the remote server."); } int delay = tryIndex > 0 ? (int)Math.Pow(tryDelayFormulaBase, tryIndex) : 0; if (delay > 0) { if (Settings.Current.HeadlessMode) { Log.Write("Retrying in %@ seconds... ", LogLevel.Message, delay.ToString("N0")); System.Threading.Thread.Sleep(delay * 1000); } else { Log.Write("Retrying in %@ seconds. Press Q at any time to abort. ", LogLevel.Message, delay.ToString("N0")); for (int i = 0; i < delay; i++) { System.Threading.Thread.Sleep(1000); while (Console.KeyAvailable) { if (Console.ReadKey().Key == ConsoleKey.Q) { abortLoop = true; throw new TimeoutException("The operation timed out and a retry attempt was aborted"); } } } } Log.WriteLine("Retrying..."); } if (tryIndex > 0) { Log.Write("Try %@ of %@. ", LogLevel.Message, tryIndex + 1, maxTries); } tryIndex++; Log.Write("Connecting to the remote FTP host (%@) at ftp://%@@%@:%@... ", LogLevel.Message, Identifier, FtpClient.Credentials.UserName, PublicFtpHostname, PublicFtpPort.ToString()); FtpClient.RetryAttempts = 1; FluentFTP.FtpProfile profile = FtpClient.AutoConnect(); if (profile == null || !FtpClient.IsConnected) { throw new TimeoutException("The operation timed out."); } Log.WriteColoredLine("OK! (%@)", ConsoleColor.Green, LogLevel.Message, profile.DataConnection.ToString()); } catch (Exception ex) { Log.WriteColoredLine("FAIL!", ConsoleColor.Red, LogLevel.Error); Log.WriteLine("Failed to connect. %@. %@", LogLevel.Error, ex.GetType().Name, ex.Message); if (abortLoop) { throw; } } } Log.WriteLine("Connected to ftp://%@@%@:%@/. Server Type: %@", LogLevel.Debug, FtpClient.Credentials.UserName, PublicFtpHostname, PublicFtpPort.ToString(), FtpClient.SystemType); Log.WriteLine("Requesting file info for %@...", LogLevel.Debug, url); try { FluentFTP.FtpListItem remoteFileInfo = FtpClient.GetObjectInfo(url); if (remoteFileInfo == null) { throw new IOException("The requested FTP file does not exists."); } FtpCurrentTransferSize = FtpClient.GetFileSize(url); Log.WriteLine(" File size: %@ bytes.", LogLevel.Debug, FtpCurrentTransferSize.ToString("N0")); if (FtpCurrentTransferSize == 0) { //FtpClient.Disconnect(); throw new IOException("The requested file is empty."); } } catch (Exception ex) { Log.WriteLine("An error occurred while requesting file info. %@. %@", LogLevel.Warning, ex.GetType().Name, ex.Message); throw; } try { using (FileStream fs = new FileStream(localFile.FullName, FileMode.Create, FileAccess.Write, FileShare.None)) { FtpClient.Download(fs, url, progress: FtpTransferProgressUpdated); if (Console.CursorLeft > 0) { Log.WriteLine(); } if (fs.Position == FtpCurrentTransferSize || FtpCurrentTransferSize == -1) { Log.WriteLine("File transfer completed. %@ bytes received.", LogLevel.Debug, fs.Position.ToString("N0")); } else { Log.WriteLine("File transfer completed but file size differs!!. Expected %@ but received %@ bytes.", LogLevel.Error, FtpCurrentTransferSize.ToString("N0"), fs.Position.ToString("N0")); if (!Settings.Current.IgnoreFtpTransferSizeMismatch) { //FtpClient.Disconnect(); throw new IOException("The received file doesnt match the expected file length."); } } } } catch (Exception ex) { Log.WriteLine("An error occurred while requesting the file. %@. %@. Aborted.", LogLevel.Error, ex.GetType().Name, ex.Message); throw; } //FtpClient.Disconnect(); //Log.WriteLine("Disconnected from FTP server.", LogLevel.Debug); localFile.Refresh(); return(localFile); }