Example #1
0
 public override bool Load()
 {
     Log.WriteLine($"Loading database...");
     if (Directory.Exists(Path))
     {
         Mut.WaitOne();
         Collections.Clear();
         string[] files = Directory.GetFiles(Path);
         foreach (string file in files)
         {
             // file = Full Path
             string     name = System.IO.Path.GetFileNameWithoutExtension(file);
             Collection c    = JsonConvert.DeserializeObject <Collection>(
                 Encoding.UTF8.GetString(File.Sync.ReadFile(file)),
                 SerializerSettings);
             Collections.Add(name, c);
         }
         Mut.ReleaseMutex();
         Log.WriteLine($"Loaded {files.Length} collections.");
         return(true);
     }
     else
     {
         Mut.WaitOne();
         Directory.Create(Path);
         Collections.Clear();
         Mut.ReleaseMutex();
         Log.WriteLine("No database found. Created directory.");
         return(false);
     }
 }
Example #2
0
        /// <summary>
        /// 根据Type获取自己的收藏,只能由MainThread执行
        /// </summary>
        /// <param name="reParame"></param>
        /// <param name="type"></param>
        protected void GetCollectionByType(RequestParameEntity reParame, string type, string url)
        {
            GetTypeStr = type;

            var listUrl = url + type;

            EachListPage(listUrl, DownContentType.OwnCollection, new Action <string>(itemUrl =>
            {
                if (!Mut.IsContinue)
                {
                    return;
                }

                itemUrl = HtmlHelp.NeedHost(listUrl, itemUrl);

                var ri = new RequestItemParameEntity()
                {
                    ItemUrl = itemUrl, SavePath = reParame.SavePath
                };

                if (IsSingle)
                {
                    GetWorksItem(ri);
                }
                else
                {
                    while (!Mut.DoDownAction(ri, GetWorksItem) && Mut.IsContinue)
                    {
                        Thread.Sleep(1000);
                    }
                }
            }));
        }
Example #3
0
 public override object this[string index]
 {
     get
     {
         Mut.WaitOne();
         bool success = TryGetValue(index, out object v);
         Mut.ReleaseMutex();
         if (success)
         {
             return(v);
         }
         else
         {
             return(null);
         }
     }
     set
     {
         Mut.WaitOne();
         if (ContainsKey(index))
         {
             if (Remove(index))
             {
                 Add(index, value);
             }
         }
         else
         {
             Add(index, value);
         }
         Mut.ReleaseMutex();
     }
 }
Example #4
0
        /// <summary>
        /// 解压文件
        /// </summary>
        /// <param name="objParame"></param>
        protected void UnZipFile(object objParame)
        {
            var parame   = (Dictionary <string, string>)objParame;
            var savePath = parame["SavePath"].Replace("\\", "/").Replace("//", "/");
            var fileUrl  = parame["FileUrl"].Replace("\\", "/").Replace("//", "/");
            var fileName = parame["FileName"].Replace("\\", "/").Replace("//", "/");
            var delay    = parame["Delay"];

            //将文件解压
            var zipDir = savePath + "/" + Path.GetFileNameWithoutExtension(fileUrl);

            try
            {
                ZipHelp.ExtractToDirectory(fileName, zipDir);

                //将文件解压后的文件夹中的图片转为GIF
                var fs = Directory.GetFiles(zipDir);
                GifHelp.ImageToGif(fs, zipDir + ".gif", int.Parse(delay));
            }
            catch (Exception ex)
            {
                AddErrorMsg(string.Format("解压文件{0}失败!\r\n{1}\r\n", fileName, ex.Message));
                HtmlHelp.SaveStringToTxt(ex.StackTrace + "\r\n", "Error.txt");
            }
            finally
            {
                Mut.DisposeUnZipThread();
            }
        }
Example #5
0
        /// <summary>
        /// 获取单个画师,只能由DoGetThread执行
        /// </summary>
        /// <param name="listUrl">画师作品列表页</param>
        protected void GetSingle(object objParame)
        {
            try
            {
                if (!Mut.IsContinue)
                {
                    return;
                }

                //因为循环里没有做修改,所有可以放外面
                var parame = (RequestParameEntity)objParame;

                MyForm.BeginInvoke(new Action(() => { MyForm.RtxtSuccess.Text = ""; }));

                if (IsSingle)
                {
                    MyForm.Invoke(new Action(() => { MyForm.TxtSavePath.Text = parame.SavePath; }));
                }

                EachListPage(parame.ListUrl, DownContentType.SinglePainter, new Action <string>(itemUrl =>
                {
                    if (!Mut.IsContinue)
                    {
                        return;
                    }

                    itemUrl = HtmlHelp.NeedHost(parame.ListUrl, itemUrl);

                    var ri = new RequestItemParameEntity()
                    {
                        ItemUrl = itemUrl, SavePath = parame.SavePath
                    };

                    if (IsSingle)
                    {
                        GetWorksItem(ri);
                    }
                    else
                    {
                        while (!Mut.DoDownAction(ri, GetWorksItem) && Mut.IsContinue)
                        {
                            Thread.Sleep(1000);
                        }
                    }
                }));
            }
            catch (Exception ex)
            {
                AddErrorMsg(ex.Message + "\r\n");
                HtmlHelp.SaveStringToTxt(ex.Message + "\r\n" + ex.StackTrace + "\r\n\r\n", "Error.txt");
            }
            finally
            {
                //if (!IsSingle)
                //{
                //    Mut.RemoveGThread();
                //}
            }
        }
Example #6
0
        public override List <Document> FindMatching(Predicate <Document> predicate)
        {
            Mut.WaitOne();
            List <Document> l = FindAll(predicate);

            Mut.ReleaseMutex();
            return(l);
        }
Example #7
0
        public override Document FindOne(Predicate <Document> predicate)
        {
            Mut.WaitOne();
            Document t = Find(predicate);

            Mut.ReleaseMutex();
            return(t);
        }
Example #8
0
        public override int RemoveMatching(Predicate <Document> predicate)
        {
            Mut.WaitOne();
            int count = RemoveAll(predicate);

            Mut.ReleaseMutex();
            return(count);
        }
Example #9
0
        public bool HasCollection(string name)
        {
            Mut.WaitOne();
            bool success = Collections.TryGetValue(name, out Collection val);

            Mut.ReleaseMutex();
            return(success);
        }
Example #10
0
        public override bool RemoveCollection(string name)
        {
            Mut.WaitOne();
            bool success = Collections.Remove(name);

            Mut.ReleaseMutex();
            return(success);
        }
Example #11
0
        public override bool RemoveOne(Predicate <Document> predicate)
        {
            Mut.WaitOne();
            bool success = Remove(Find(predicate));

            Mut.ReleaseMutex();
            return(success);
        }
Example #12
0
        public override Collection GetCollection(string name)
        {
            Mut.WaitOne();
            bool success = Collections.TryGetValue(name, out Collection val);

            Mut.ReleaseMutex();
            if (!success)
            {
                return(null);
            }
            else
            {
                return(val);
            }
        }
Example #13
0
 public override void Save()
 {
     Log.WriteLine("Saving database...");
     Mut.WaitOne();
     Dictionary <string, Collection> .Enumerator en = Collections.GetEnumerator();
     while (en.MoveNext())
     {
         string path = System.IO.Path.Join(Path, $"{en.Current.Key}.json");
         en.Current.Value.Lock();
         byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(en.Current.Value, Database.SerializerSettings));
         File.Sync.OverwriteFile(data, path);
         en.Current.Value.Release();
     }
     Mut.ReleaseMutex();
     Log.WriteLine("Done.");
 }
Example #14
0
        /// <summary>
        /// 下载搜索
        /// Url 必须是完整的地址,只能由MainThread执行
        /// </summary>
        /// <param name="objParame"></param>
        private void GetSearch(object objParame)
        {
            try
            {
                var parame = (RequestParameEntity)objParame;
                EachListPage(parame.ListUrl, DownContentType.GetSearch, new Action <string>(itemUrl =>
                {
                    if (!Mut.IsContinue)
                    {
                        return;
                    }

                    itemUrl = "/member_illust.php?mode=medium&illust_id=" + itemUrl;
                    itemUrl = HtmlHelp.NeedHost(parame.ListUrl, itemUrl);

                    //都下载同一个地方,不用克隆
                    var ri = new RequestItemParameEntity()
                    {
                        ItemUrl = itemUrl, SavePath = parame.SavePath
                    };

                    if (IsSingle)
                    {
                        GetWorksItem(ri);
                    }
                    else
                    {
                        while (!Mut.DoDownAction(ri, GetWorksItem) && Mut.IsContinue)
                        {
                            Thread.Sleep(1000);
                        }
                    }
                }));
            }
            catch (Exception ex)
            {
                AddErrorMsg(ex.Message + "\r\n");
                HtmlHelp.SaveStringToTxt(ex.Message + "\r\n" + ex.StackTrace + "\r\n\r\n", "Error.txt");
            }
            finally
            {
                if (MainThread != null && MainThread.IsAlive)
                {
                    MainThread.Abort();
                }
            }
        }
Example #15
0
        public override bool AddCollection(string name, out Collection collection)
        {
            Mut.WaitOne();
            Collection t       = new Collection();
            bool       success = Collections.TryAdd(name, t);

            if (success)
            {
                collection = t;
            }
            else
            {
                collection = null;
            }
            Mut.ReleaseMutex();
            return(success);
        }
Example #16
0
        /// <summary>
        /// 根据type获取关注的画师,只能由MainThread执行
        /// </summary>
        /// <param name="reqParame"></param>
        /// <param name="type"></param>
        private void GetAllFollowByType(RequestParameEntity reqParame, string type)
        {
            GetTypeStr = type;

            string paListUrl = string.Format("https://www.pixiv.net/bookmark.php?type=user&rest={0}&p=1", type);

            EachListPage(paListUrl, DownContentType.AllFollow, new Action <string>(id =>
            {
                if (!Mut.IsContinue)
                {
                    return;
                }

                //因为是引用类型,所以要复制
                var parame = (RequestParameEntity)reqParame.Clone();

                //因为这里是遍历集合,所以不能只用SavePath
                parame.SavePath = parame.ParentPath + "/" + id;
                parame.SavePath = parame.SavePath.Replace("\\", "/").Replace("//", "/");
                var listUrl     = GetListUrlByID(id, parame.SavePath);
                if (listUrl != "")
                {
                    //列表Url从关注列表Url变为某个画师的作品列表Url
                    parame.ListUrl = listUrl;

                    if (IsSingle)
                    {
                        GetSingle(parame);
                    }
                    else
                    {
                        while (!Mut.DoGetAction(parame, GetSingle) && Mut.IsContinue)
                        {
                            Thread.Sleep(1000);
                        }
                    }
                }
            }));
        }
Example #17
0
 public override void Each(Action <Document> action)
 {
     Mut.WaitOne();
     ForEach(action);
     Mut.ReleaseMutex();
 }
Example #18
0
 public override void Release()
 {
     Mut.ReleaseMutex();
 }
Example #19
0
        /// <summary>
        /// 获取指定作品的动画
        /// </summary>
        protected void GetCanvasZipFile(string itemUrl, string savePath, string pid)
        {
            //可以获取zip的url
            var zipHtmlUrl = string.Format("https://www.pixiv.net/ajax/illust/{0}/ugoira_meta", pid);

            var html = DownHelp.GetHtmlString(zipHtmlUrl, Encoding.UTF8, 5);
            var fReg = new Regex(RegexHelp.Other.GetAnimation, RegexOptions.Singleline);
            var fM   = fReg.Match(html);

            if (fM == null || fM.Groups["Url"].Value == "")
            {
                AddErrorMsg(string.Format("获取 {0} 的动画失败!\r\n", itemUrl));
                return;
            }

            //zip的Url路径
            var fileUrl = fM.Groups["Url"].Value.Replace("\\/", "/");

            //zip文件名
            var fileName = savePath + "/" + Path.GetFileName(fileUrl);

            lock (Multithreading.ObjLockExistFile)
            {
                if (File.Exists(fileName))
                {
                    if (MyForm.ChkNeglect.Checked)
                    {
                        AddErrorMsg(string.Format("文件{0}已存在,已忽略!\r\n", fileName));
                    }
                    return;
                }
            }

            //获取文件总大小
            var total = HtmlHelp.GetFileContenLength(fileUrl, itemUrl);

            if (total == 0)
            {
                AddErrorMsg(string.Format("获取 {0} 的大小失败!\r\n", fileUrl));
                return;
            }

            //分批获取文件
            var b = HtmlHelp.DownFile(fileUrl, fileName, itemUrl, 299999, total);

            if (b)
            {
                AddSuccessMsg(string.Format("下载 {0} 的文件成功!\r\n", fileUrl));
            }
            else
            {
                AddErrorMsg(string.Format("下载 {0} 的文件失败!\r\n Url:{1}\r\n", fileUrl, itemUrl));
                if (File.Exists(fileName))
                {
                    File.Delete(fileName);
                }
                return;
            }

            //获取delay
            var dr    = new Regex(RegexHelp.Other.GetDelay, RegexOptions.Singleline);
            var dm    = dr.Match(html);
            var delay = "50";

            if (dm != null && dm.Groups["Delay"].Value != "")
            {
                delay = dm.Groups["Delay"].Value;
            }

            var dic = new Dictionary <string, string>()
            {
                { "SavePath", savePath },
                { "FileUrl", fileUrl },
                { "FileName", fileName },
                { "Delay", delay }
            };

            while (!Mut.UnZipFile(dic, UnZipFile))
            {
                Thread.Sleep(5000);
            }
        }
        static void Main(string[] args)
        {
            bool fimAplicacao = false;

            Console.WriteLine("Operações Matemáticas em C#\r");
            Console.WriteLine("------------------------\n");

            while (!fimAplicacao)
            {
                string numInput1 = "";
                string numInput2 = "";
                double result    = 0;

                Console.Write("Por favor, digite um número e pressione Enter: ");
                numInput1 = Console.ReadLine();

                double cleanNum1 = 0;
                while (!double.TryParse(numInput1, out cleanNum1))
                {
                    Console.Write("Valor digitado não é um número. Por favor, digite um valor do tipo número: ");
                    numInput1 = Console.ReadLine();
                }

                Console.Write("Novamente, digite outro número e pressione Enter: ");
                numInput2 = Console.ReadLine();

                double cleanNum2 = 0;
                while (!double.TryParse(numInput2, out cleanNum2))
                {
                    Console.Write("Valor digitado não é um número. Por favor, digite um valor do tipo número: ");
                    numInput2 = Console.ReadLine();
                }

                Console.WriteLine("Agora, escolha qual operação deseja realizar: ");
                Console.WriteLine("\t1 - Soma");
                Console.WriteLine("\t2 - Subração");
                Console.WriteLine("\t3 - Multiplicação");
                Console.WriteLine("\t4 - Divisão");
                Console.Write("Sua opção é ? ");

                string option = Console.ReadLine();


                try
                {
                    if (option == "1")
                    {
                        Console.WriteLine("Você usou a class Addtion");
                        result = Add.Operartion(cleanNum1, cleanNum2, option);
                        if (double.IsNaN(result))
                        {
                            Console.WriteLine("Esta operação resultou num erro.\n");
                        }
                        else
                        {
                            Console.WriteLine("O resultado da operação é : {0:0.##}\n", result);
                        }
                    }

                    if (option == "2")
                    {
                        Console.WriteLine("Você usou a class Subtration");
                        result = Sub.Operation(cleanNum1, cleanNum2, option);
                        if (double.IsNaN(result))
                        {
                            Console.WriteLine("Esta operação resultou num erro.\n");
                        }
                        else
                        {
                            Console.WriteLine("O resultado da operação é : {0:0.##}\n", result);
                        }
                    }

                    if (option == "3")
                    {
                        Console.WriteLine("Você selecionou a class Multiplication");
                        result = Mut.Operation(cleanNum1, cleanNum2, option);
                        if (double.IsNaN(result))
                        {
                            Console.WriteLine("Esta operação resulto num erro.\n");
                        }
                        else
                        {
                            Console.WriteLine("O resultado da operação é : {0:0.##}\n", result);
                        }
                    }

                    if (option == "4")
                    {
                        Console.WriteLine("Você selecionou a class Division");
                        result = Div.Operation(cleanNum1, cleanNum2, option);
                        if (double.IsNaN(result))
                        {
                            Console.WriteLine("Esta operação resulto num erro.\n");
                        }
                        else
                        {
                            Console.WriteLine("O resultado da operação é : {0:0.##}\n", result);
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Oh Não! uma exceção ocorreu na operação.\n - Detalhes: " + e.Message);
                }

                Console.WriteLine("------------------------\n");


                Console.Write("Digite 's' e logo em seguida, pressione Enter para fechar a aplicação, ou digite qualquer tecla, e pressione Enter para continuar: ");
                if (Console.ReadLine() == "s")
                {
                    fimAplicacao = true;
                }

                Console.WriteLine("\n");
            }
            return;
        }
Example #21
0
 public override void Lock()
 {
     Mut.WaitOne();
 }
Example #22
0
 public void IntelligencePlusOne()
 {
     _intelligence++;
     Mut?.Invoke();
 }