/// <summary> /// Асинхронный загрузщик файлов в AnonFile /// </summary> /// <param name="dataSaveInfo">Информация о загружаемой части файла</param> /// <param name="vs">Файл в виде массива byte</param> /// <param name="massenge">delegate для логирования состояния</param> private void HendlerUpload(DataSaveInfo dataSaveInfo, byte[] vs, FunctionAndSetting.Massenge massenge = null) { restart: try { // Записываем данные dataSaveInfo.UrlFileID = functionAndSetting.Upload(vs, dataSaveInfo.FileIdName.ToString()); dataSaveInfo.Size = vs.LongLength; // Добавляем информацию в общию бд uploadFileInfo.Parts.Add(dataSaveInfo); restTwo: try { File.AppendAllText(StateInfoPatchFile, JsonConvert.SerializeObject(dataSaveInfo) + "\r\n"); } catch { goto restTwo; } // Уменьшаем значение загружаемых на данный момент файлов Count--; // Оповещание о загрузке файла if (massenge != null) { massenge.Invoke("Загружен файл с ID: " + dataSaveInfo.FileIdName, ConsoleColor.Gray); } } catch (Exception e) { if (massenge != null) { massenge.Invoke(String.Format("Произошла ошибка {0} при загрузке осуществляю перезапуск {1}", e.Message, dataSaveInfo.FileIdName), ConsoleColor.Yellow); } goto restart; } }
//==================================================== Методы public void DownloadHendler(string UrlFile, string PatchTo, string NameFile = null, byte MaxFilesUpload = 1, string Password = null, FunctionAndSetting.Massenge massenge = null) { if (!Directory.Exists(PatchTo)) { if (massenge != null) { massenge.Invoke("[Error] Такой директории не существует", ConsoleColor.Red); } return; } this.MaxFilesUpload = MaxFilesUpload; Count = 0; CountUploadetPart = 0; // Качаем главный файл byte[] FileHead = functionAndSetting.DeCompress(UploadDownloadWdho.Download.GetBytesFile(UrlFile), Password); try { uploadFileInfo = JsonConvert.DeserializeObject <UploadFileInfo>(Encoding.UTF8.GetString(FileHead)); FolderPart = Path.Combine(PatchTo, uploadFileInfo.NameFale + functionAndSetting.GetKeyFile(UrlFile) + FunctionAndSetting.ExpansionDownload); try { List <string> IgnorePart = new List <string>(0); if (Directory.Exists(FolderPart)) { string[] allfiles = Directory.GetFiles(FolderPart); foreach (var Elem in allfiles) { if (Path.GetFileName(Elem).Contains(FunctionAndSetting.ExpansionDownload)) { string s = Path.GetFileName(Elem).Replace(FunctionAndSetting.ExpansionDownload, null); IgnorePart.Add(s); if (!File.Exists(Path.Combine(FolderPart, s))) { OldIdSave = Math.Max(OldIdSave, Convert.ToInt64(s)); } CountUploadetPart++; } } } else { Directory.CreateDirectory(FolderPart); OldIdSave = long.MaxValue; } if (File.Exists(Path.Combine(PatchTo, uploadFileInfo.NameFale))) { file = new FileStream(Path.Combine(PatchTo, uploadFileInfo.NameFale), FileMode.Append); } else { file = new FileStream(Path.Combine(PatchTo, uploadFileInfo.NameFale), FileMode.OpenOrCreate); } long FileSize = 0; foreach (var Elem in uploadFileInfo.Parts) { FileSize += Elem.Size; } if (FileSize == file.Length) { if (Directory.Exists(FolderPart)) { restDelO : try { Directory.Delete(FolderPart, true); } catch { goto restDelO; } } return; } foreach (var Elem in uploadFileInfo.Parts) { if (IgnorePart.Contains(Elem.FileIdName.ToString())) { if (massenge != null) { massenge.Invoke("[Info] Файл был ранее загружен", ConsoleColor.Green); } continue; } while (Count >= MaxFilesUpload) { UploadPart(); // Ждем своей очереди загрузки } Count++; Task.Run(() => DovnloadFile(Elem)); } while (Count > 0 || CountUploadetPart != uploadFileInfo.Parts.Count) { UploadPart(); // Ждём загрузку оставшихся файлов } restDel : try { Directory.Delete(FolderPart, true); } catch { goto restDel; } file.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } } catch (Exception e) { File.WriteAllBytes(((NameFile == null) ? Path.Combine(PatchTo, functionAndSetting.GetNameFile(UrlFile)) : Path.Combine(PatchTo, NameFile)), FileHead); } if (massenge != null) { massenge.Invoke("[Info] Файл успешно скачан", ConsoleColor.Green); } }
/// <summary> /// Загрузка файла или директории с файлами и папками /// </summary> /// <param name="Patch">Путь к файлу или директории</param> /// <param name="Password">Пароль для шифрования</param> /// <param name="MaxFilesUpload">Максимальное число одновременно загружающихся частей файла</param> /// <param name="massenge">Метод для логирования</param> /// <returns></returns> public string UploadFolder(string Patch, string Password = null, byte MaxFilesUpload = 1, FunctionAndSetting.Massenge massenge = null) { BdDirectory Bd = new BdDirectory { UploadetFiles = new List <OneElemSaveDir>(0) }; UploadFile uploadFile = new UploadFile(ref functionAndSetting); TemporaryFileInfoSaved = Path.Combine(Patch, Path.GetFileName(Patch) + FunctionAndSetting.ExpansionUploadDirectory); if (File.Exists(TemporaryFileInfoSaved)) { string[] res = File.ReadAllText(TemporaryFileInfoSaved).Split("\r\n"); for (long i = 1; i < res.LongLength; i++) { Bd.UploadetFiles.Add(JsonConvert.DeserializeObject <OneElemSaveDir>(res[i])); } } else { File.WriteAllText(TemporaryFileInfoSaved, null); } string[] PatchSaves = GetFilesFolders(Patch).ToArray(); foreach (var Elem in PatchSaves) { if (!CheckPartList(Bd.UploadetFiles, Path.GetFullPath(Elem).Replace(Path.GetFullPath(Patch), null))) { if (File.Exists(Elem)) { OneElemSaveDir oneElem = new OneElemSaveDir { SaveDirectory = Path.GetFullPath(Elem).Replace(Path.GetFullPath(Patch), null), Password = random.Next(int.MinValue, int.MaxValue).ToString() }; oneElem.ResulUploadFileInfo = uploadFile.UploadFileHendler(Elem, MaxFilesUpload, oneElem.Password, massenge); Bd.UploadetFiles.Add(oneElem); restAddDat : try { File.AppendAllText(TemporaryFileInfoSaved, "\r\n" + JsonConvert.SerializeObject(oneElem)); } catch { goto restAddDat; } } else if (Directory.Exists(Elem) && Directory.GetDirectories(Elem).Length <= 0) { Bd.UploadetFiles.Add(new OneElemSaveDir { SaveDirectory = Path.GetFullPath(Elem).Replace(Path.GetFullPath(Patch), null) }); } } } File.Delete(TemporaryFileInfoSaved); return(functionAndSetting.Upload(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Bd)), "info.txt")); }
//==================================================== Методы public ResulUploadFileInfo UploadFileHendler(string PatchFile, byte MaxFilesUpload = 1, string Password = null, FunctionAndSetting.Massenge massenge = null) { if (!File.Exists(PatchFile)) { if (massenge != null) { massenge.Invoke("[Error] Такого пути к файлу не существует", ConsoleColor.Red); } return(new ResulUploadFileInfo()); } this.MaxFilesUpload = MaxFilesUpload; Count = 0; StateInfoPatchFile = Path.Combine(Path.GetDirectoryName(PatchFile), Path.GetFileName(PatchFile) + FunctionAndSetting.ExpansionUpload); uploadFileInfo = new UploadFileInfo { NameFale = Path.GetFileName(PatchFile), Parts = new List <DataSaveInfo>(0) }; // Проверяем если файл меньше одной части то сразу он сохраняется if ((new System.IO.FileInfo(PatchFile)).Length <= (FunctionAndSetting.OneMb * functionAndSetting.MaxMbPart)) { if (massenge != null) { massenge.Invoke("[Info] Файл не будет разбит на несколько частей", ConsoleColor.Blue); } return(new ResulUploadFileInfo { UrlSave = UploadDownloadWdho.Upload.UploadHendler(functionAndSetting.Compress(File.ReadAllBytes(PatchFile), Password), Path.GetFileName(PatchFile)).url, InfoSave = true }); } else { // Запуск потока чтения основного файла который будет разбит FileStream file = new FileStream(PatchFile, FileMode.Open); // Необходимо чтобы индифицировать части long c = long.MaxValue; // Получаем сколько будет весить одна часть в байтах ulong @byte = (ulong)functionAndSetting.MaxMbPart * FunctionAndSetting.OneMb; // Сколько раз нужно пройтись по файлу чтобы считать одну часть long count = (long)((@byte % (FunctionAndSetting.OneMb * functionAndSetting.MaxFilePrtRead) > 0) ? (long)(@byte / (FunctionAndSetting.OneMb * functionAndSetting.MaxFilePrtRead)) + 1 : (long)(@byte / (FunctionAndSetting.OneMb * functionAndSetting.MaxFilePrtRead))); if (massenge != null) { massenge.Invoke(String.Format("[Info] Файл будет разбит на {0} частей", (file.Length % (FunctionAndSetting.OneMb * functionAndSetting.MaxMbPart) > 0 ? file.Length / (FunctionAndSetting.OneMb * functionAndSetting.MaxMbPart) + 1 : file.Length / (FunctionAndSetting.OneMb * functionAndSetting.MaxMbPart))), ConsoleColor.Blue); } if (File.Exists(StateInfoPatchFile)) { string[] PartInfo = File.ReadAllText(StateInfoPatchFile).Split("\r\n"); if (PartInfo[0] == @byte.ToString()) { for (long i = 1; i < (PartInfo.LongLength - 1); i++) { uploadFileInfo.Parts.Add(JsonConvert.DeserializeObject <DataSaveInfo>(PartInfo[i])); if (massenge != null) { massenge.Invoke("[Info] Ранее эта часть была загружена восстанавливаю данные", ConsoleColor.Green); } } } } else { File.WriteAllText(StateInfoPatchFile, @byte + "\r\n"); } // Разбитие на файлы while (file.Position < file.Length - 1) { if (SearchIdFileBd((c + 1))) { file.Position += Math.Min((long)@byte, (long)(file.Length - file.Position)); if (massenge != null) { massenge.Invoke("[Info] Эта часть была ранее загружена и успешно восстановлена", ConsoleColor.Green); } c++; continue; } // Добавляем в список информацию о названии части DataSaveInfo dataSaveInfo = new DataSaveInfo { FileIdName = ++c, Password = random.Next(0, int.MaxValue - 1).ToString() }; List <byte> BtPart = new List <byte>(0); // Запись данных в временный файл for (long i = 0; i < count; i++) { byte[] vs = new byte[Math.Min((FunctionAndSetting.OneMb * functionAndSetting.MaxFilePrtRead), file.Length - file.Position)]; file.Read(vs, 0, vs.Length); BtPart.AddRange(vs); } if (massenge != null) { massenge.Invoke("[Info] Файл разбит", ConsoleColor.Blue); } while (Count >= MaxFilesUpload - 1) { ; // Ждем своей очереди загрузки } Count++; Task.Run(() => HendlerUpload(dataSaveInfo, functionAndSetting.Compress(BtPart.ToArray(), dataSaveInfo.Password), massenge)); //function.Compress(); } file.Close(); while (Count > 0) { ; // Ждём загрузку оставшихся файлов } uploadFileInfo.Parts.Sort(new ShortStruct()); // Сортировка бд restDel : if (File.Exists(StateInfoPatchFile)) { try { File.Delete(StateInfoPatchFile); } catch { goto restDel; } } if (massenge != null) { massenge.Invoke("[Info] Файл успешно загружен", ConsoleColor.Green); } return(new ResulUploadFileInfo { UrlSave = functionAndSetting.Upload(functionAndSetting.Compress(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(uploadFileInfo)), Password), "info"), InfoSave = false }); } }
public void Download(string Patch, string UrlFile, string Password = null, byte MaxFilesUpload = 1, FunctionAndSetting.Massenge massenge = null) { if (!Directory.Exists(Patch)) { if (massenge != null) { massenge.Invoke("[-] Неправильно указан путь к директории\r\n", ConsoleColor.Red); } return; } // Качаем главный файл try { BdDirectory bdDirectory = JsonConvert.DeserializeObject <BdDirectory>(Encoding.UTF8.GetString(functionAndSetting.DeCompress(functionAndSetting.Download(UrlFile), Password))); if (bdDirectory.UploadetFiles.Count <= 0) { if (massenge != null) { massenge.Invoke("[Error] Ошибка получения главного файла", ConsoleColor.Red); } return; } else { TemporaryFileInfoSaved = Path.Combine(Patch, functionAndSetting.GetKeyFile(UrlFile) + FunctionAndSetting.ExpansionDownloadDirectory); List <string> maskDownload = new List <string>(0); if (File.Exists(TemporaryFileInfoSaved)) { string[] res = File.ReadAllText(TemporaryFileInfoSaved).Split("\r\n"); for (long i = 1; i < res.LongLength; i++) { maskDownload.Add(res[i]); } } else { File.WriteAllText(TemporaryFileInfoSaved, null); } DownloadFile downloadFile = new DownloadFile(functionAndSetting); foreach (var Elem in bdDirectory.UploadetFiles) { if (!maskDownload.Contains(Elem.ResulUploadFileInfo.UrlSave)) { // Проверяем является запись пустой папкой if (Elem.ResulUploadFileInfo.UrlSave == null) { Directory.CreateDirectory((Elem.SaveDirectory != null && Elem.SaveDirectory.Length > 0 && Elem.SaveDirectory.Replace('/', '\\')[0] == '\\') ? Path.Combine(Patch, Elem.SaveDirectory.Remove(0, 1)) : Path.Combine(Patch, Elem.SaveDirectory)); } else { string PatchSave = GetPatchLocal(Elem.SaveDirectory) != null?Path.Combine(Patch, GetPatchLocal(Elem.SaveDirectory)) : Patch; Directory.CreateDirectory(PatchSave); downloadFile.DownloadHendler(Elem.ResulUploadFileInfo.UrlSave, PatchSave, Path.GetFileName(Elem.SaveDirectory), MaxFilesUpload, Elem.Password, massenge); } resSevInfo : try { File.AppendAllText(TemporaryFileInfoSaved, "\r\n" + Elem.ResulUploadFileInfo.UrlSave); } catch { goto resSevInfo; } } } } resDel : try { if (File.Exists(TemporaryFileInfoSaved)) { File.Delete(TemporaryFileInfoSaved); } } catch { goto resDel; } } catch (Exception e) { if (massenge != null) { massenge.Invoke("[Error] Ошибка получения главного файла", ConsoleColor.Red); } return; } }