/// <summary> /// Загрузить файл с удаленого сервера /// </summary> /// <param name="LocalFile">Полный путь к локальному файлу</param> /// <param name="RemoteFile">Полный путь к удаленому файлу</param> /// <param name="EncryptionAES">Использовать шифрование AES 256</param> /// <param name="PasswdAES">Пароль для шифрования файлов</param> /// <param name="FileSize">Размер файла</param> public bool DownloadFile(string LocalFile, string RemoteFile, bool EncryptionAES, string PasswdAES, long FileSize) { // Временный файл string tmpFile = $"{Folders.Temp.SyncBackup}/{md5.text(RemoteFile)}"; // Путь к конечному файлу string targetFile = EncryptionAES ? tmpFile : LocalFile; try { #region Удаляем файлы для перезаписи if (File.Exists(LocalFile)) { File.Delete(LocalFile); } if (File.Exists(tmpFile)) { File.Delete(tmpFile); } #endregion #region Загружаем файл switch (typeSunc) { case TypeSunc.SFTP: { using (FileStream LocalStream = new FileStream(targetFile, FileMode.Create, FileAccess.Write)) { sftp.DownloadFile(RemoteFile, LocalStream); break; } } case TypeSunc.FTP: { ftp.DownloadFile(targetFile, RemoteFile, overwrite: true); break; } case TypeSunc.OneDrive: { var item = oneDrive.GetItem(RemoteFile).Result; if (item == null) { report.DownloadFile(targetFile, RemoteFile, EncryptionAES, FileSize, "OneDrive.GetItem(RemoteFile) == null"); return(false); } oneDrive.DownloadItemAndSaveAs(item, targetFile).Wait(); break; } case TypeSunc.WebDav: { var res = webDav.GetRawFile(RemoteFile).Result; if (!res.IsSuccessful) { report.DownloadFile(targetFile, RemoteFile, EncryptionAES, FileSize, (res.Description, res.StatusCode)); return(false); } using (FileStream LocalStream = new FileStream(targetFile, FileMode.Create, FileAccess.Write)) { CopyStream(res.Stream, LocalStream, FileSize); break; } } } #endregion #region CryptoBox if (EncryptionAES) { using (var сryptoBox = new CryptoBox(PasswdAES, LocalFile, _tmpFile: tmpFile)) { if (!сryptoBox.Decrypt(out string error)) { report.DownloadFile(LocalFile, RemoteFile, EncryptionAES, FileSize, error); return(false); } } } #endregion return(true); } catch (Exception ex) { report.DownloadFile(targetFile, RemoteFile, EncryptionAES, FileSize, ex.ToString()); } return(false); }
/// <summary> /// Загрузить файл с удаленого сервера /// </summary> /// <param name="LocalFile">Полный путь к локальному файлу</param> /// <param name="RemoteFile">Полный путь к удаленому файлу</param> /// <param name="EncryptionAES">Использовать шифрование AES 256</param> /// <param name="PasswdAES">Пароль для шифрования файлов</param> /// <param name="FileSize">Размер файла</param> public bool DownloadFile(string LocalFile, string RemoteFile, bool EncryptionAES, string PasswdAES, long FileSize) { try { // Удаляем локальный файлл если он есть if (File.Exists(LocalFile)) { File.Delete(LocalFile); } // Открываем локальный файл using (var LocalStream = File.OpenWrite(LocalFile)) { #region Получаем поток файла на сервере Stream RemoteStream = null; switch (typeSunc) { case TypeSunc.SFTP: { RemoteStream = sftp.OpenRead(RemoteFile); break; } case TypeSunc.FTP: { RemoteStream = ftp.OpenRead(RemoteFile); break; } case TypeSunc.OneDrive: { var item = oneDrive.GetItem(RemoteFile).Result; if (item == null) { return(false); } report.DownloadFile(LocalFile, RemoteFile, EncryptionAES, FileSize, "OneDrive.GetItem(RemoteFile) == null"); RemoteStream = oneDrive.DownloadItem(item).Result; break; } case TypeSunc.WebDav: { var res = webDav.GetRawFile(RemoteFile).Result; if (!res.IsSuccessful) { report.DownloadFile(LocalFile, RemoteFile, EncryptionAES, FileSize, (res.Description, res.StatusCode)); return(false); } RemoteStream = res.Stream; break; } } #endregion if (EncryptionAES) { var cry = new CryptoBox(PasswdAES); if (!cry.Decrypt(RemoteStream, LocalStream, FileSize, out string error)) { report.DownloadFile(LocalFile, RemoteFile, EncryptionAES, FileSize, error); return(false); } } else { CopyStream(RemoteStream, LocalStream, FileSize); } RemoteStream?.Close(); if (typeSunc == TypeSunc.FTP) { ftp?.GetReply(); } return(true); } } catch (Exception ex) { report.DownloadFile(LocalFile, RemoteFile, EncryptionAES, FileSize, ex.ToString()); } return(false); }