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); } }
/// <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); } } })); }
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(); } }
/// <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(); } }
/// <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(); //} } }
public override List <Document> FindMatching(Predicate <Document> predicate) { Mut.WaitOne(); List <Document> l = FindAll(predicate); Mut.ReleaseMutex(); return(l); }
public override Document FindOne(Predicate <Document> predicate) { Mut.WaitOne(); Document t = Find(predicate); Mut.ReleaseMutex(); return(t); }
public override int RemoveMatching(Predicate <Document> predicate) { Mut.WaitOne(); int count = RemoveAll(predicate); Mut.ReleaseMutex(); return(count); }
public bool HasCollection(string name) { Mut.WaitOne(); bool success = Collections.TryGetValue(name, out Collection val); Mut.ReleaseMutex(); return(success); }
public override bool RemoveCollection(string name) { Mut.WaitOne(); bool success = Collections.Remove(name); Mut.ReleaseMutex(); return(success); }
public override bool RemoveOne(Predicate <Document> predicate) { Mut.WaitOne(); bool success = Remove(Find(predicate)); Mut.ReleaseMutex(); return(success); }
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); } }
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."); }
/// <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(); } } }
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); }
/// <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); } } } })); }
public override void Each(Action <Document> action) { Mut.WaitOne(); ForEach(action); Mut.ReleaseMutex(); }
public override void Release() { Mut.ReleaseMutex(); }
/// <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; }
public override void Lock() { Mut.WaitOne(); }
public void IntelligencePlusOne() { _intelligence++; Mut?.Invoke(); }