Esempio n. 1
0
            /// <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;
                }
            }
Esempio n. 2
0
            //==================================================== Методы
            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);
                }
            }
Esempio n. 3
0
            /// <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"));
            }
Esempio n. 4
0
            //==================================================== Методы
            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
                    });
                }
            }
Esempio n. 5
0
            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;
                }
            }