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);
        }
示例#2
0
        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);
            }
        }
示例#3
0
        /// <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);
        }
示例#4
0
 internal FtpStoreEntry(string path, FluentFTP.FtpListItem fileInfo)
 {
     _fileInfo = fileInfo ?? throw new ArgumentNullException(nameof(fileInfo));
     _path     = path ?? throw new ArgumentNullException(nameof(path));
 }
示例#5
0
 public override DateTime GetModifiedDateTime(string remotePath)
 {
     FluentFTP.FtpListItem item = _client.GetObjectInfo(remotePath);
     return(item.Modified);   //Created does not seem to work properyly during tests
 }
示例#6
0
        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);
        }