diff --git a/Form1.Designer.cs b/Form1.Designer.cs index 4317a7d..a680e6f 100644 --- a/Form1.Designer.cs +++ b/Form1.Designer.cs @@ -67,6 +67,7 @@ this.lvList.TabIndex = 0; this.lvList.UseCompatibleStateImageBehavior = false; this.lvList.View = System.Windows.Forms.View.Details; + this.lvList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvList_ColumnClick); this.lvList.SelectedIndexChanged += new System.EventHandler(this.lvList_SelectedIndexChanged); // // chTime diff --git a/Form1.cs b/Form1.cs index 58951d3..8ff6caa 100644 --- a/Form1.cs +++ b/Form1.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -16,36 +17,88 @@ namespace NewsCrawler { public partial class Form1 : Form { - class NEWS_ITEM - { - public string m_strTitle; - public DateTime m_Time; - public string m_strURL; - public string m_strReference; - } + delegate void InsertListView(bool bInitial, string strTitle, DateTime time, string strURL, string strRef); System.Timers.Timer m_CrawlTimer = new System.Timers.Timer(); int m_iCrawlInterval = 500; - Timer m_UITimer = new Timer(); - List m_ItemList = new List(); - int m_iLastItemCnt = 0; - public Form1() { InitializeComponent(); wbView.ScriptErrorsSuppressed = false; - m_CrawlTimer.Elapsed+=CrawlTimer_Tick; - m_CrawlTimer.Interval=1000; - m_CrawlTimer.Start(); + ReadKIND(true); + ReadDart(true); + ReadAsiaE(true); + ReadEtoday(true); - m_UITimer.Tick += UITimer_Tick; - m_UITimer.Interval = m_iCrawlInterval; - m_UITimer.Start(); + lvList.ListViewItemSorter = new ListViewItemComparer(0, SortOrder.Ascending); + lvList.Sorting = SortOrder.Ascending; + lvList.Sort(); + + if(lvList.Items.Count > 0) + { + lvList.Items[lvList.Items.Count - 1].Selected = true; + lvList.Select(); + if(lvList.SelectedItems.Count > 0) + lvList.SelectedItems[0].EnsureVisible(); + } + + + m_CrawlTimer.Elapsed+=CrawlTimer_Tick; + m_CrawlTimer.Interval=m_iCrawlInterval; + m_CrawlTimer.Start(); } - bool ReadAsiaE() + private void InsertItem(bool bInitial, string strTitle, DateTime time, string strURL, string strRef) + { + if(strTitle == "") + Console.WriteLine("break"); + + try + { + if(this.InvokeRequired) + { + this.Invoke(new InsertListView(InsertItem), bInitial, strTitle, time, strURL, strRef); + } + else + { + //lock(lvList) + { + foreach(ListViewItem item in lvList.Items) + { + if(item.SubItems[chLink.Index].Text == strURL) + return; + } + + lvList.Items.Add(new ListViewItem(new string[] { time.ToString("HH:mm:ss"), strTitle, "", "", strRef, strURL })); + + + if(chAutoSelect.Checked == true) + { + lvList.Items[lvList.Items.Count - 1].Selected = true; + lvList.Select(); + if(lvList.SelectedItems.Count > 0) + lvList.SelectedItems[0].EnsureVisible(); + } + + if(bInitial == false) + { + lvList.Sort(); + } + + foreach(ColumnHeader col in lvList.Columns) + col.Width = -2; + } + } + } + catch(Exception ex) + { + Console.WriteLine(ex.Message); + } + } + + bool ReadAsiaE(bool bInitial = false) { bool bHasNew = false; @@ -63,6 +116,7 @@ namespace NewsCrawler using(StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding("EUC-KR"))) { string responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd()); + responseFromServer = responseFromServer.Replace("\"\"", "\""); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(responseFromServer); @@ -81,26 +135,7 @@ namespace NewsCrawler continue; } - - if(m_ItemList.Any(c => c.m_strURL==strURL)==false) - { - NEWS_ITEM news = new NEWS_ITEM(); - news.m_strTitle=strTitle; - news.m_Time=DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture); - news.m_strURL=strURL; - news.m_strReference="아시아경제"; - - lock(m_ItemList) - { - m_ItemList.Add(news); - } - - bHasNew=true; - } - else - { - break; - } + InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "아시아경제"); } } @@ -115,7 +150,7 @@ namespace NewsCrawler return bHasNew; } - bool ReadEtoday() + bool ReadEtoday(bool bInitial = false) { bool bHasNew = false; @@ -151,25 +186,7 @@ namespace NewsCrawler continue; } - if(m_ItemList.Any(c => c.m_strURL==strURL)==false) - { - NEWS_ITEM news = new NEWS_ITEM(); - news.m_strTitle=strTitle; - news.m_Time=DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture); - news.m_strURL=strURL; - news.m_strReference="이투데이"; - - lock(m_ItemList) - { - m_ItemList.Add(news); - } - - bHasNew=true; - } - else - { - break; - } + InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "이투데이"); } } } @@ -183,7 +200,7 @@ namespace NewsCrawler return bHasNew; } - bool ReadDart() + bool ReadDart(bool bInitial=false) { bool bHasNew = false; @@ -210,6 +227,8 @@ namespace NewsCrawler foreach(var item in lists) { var rows = item.SelectNodes(".//td"); + if(rows.Count < 3) + continue; string strTitle = rows[2].InnerText; strTitle=strTitle.Trim(); @@ -225,25 +244,7 @@ namespace NewsCrawler continue; } - if(m_ItemList.Any(c => c.m_strURL==strURL)==false) - { - NEWS_ITEM news = new NEWS_ITEM(); - news.m_strTitle=strTitle; - news.m_Time=DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture); - news.m_strURL=strURL; - news.m_strReference="DART"; - - lock(m_ItemList) - { - m_ItemList.Add(news); - } - - bHasNew=true; - } - else - { - break; - } + InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "DART"); } } } @@ -257,7 +258,7 @@ namespace NewsCrawler return bHasNew; } - bool ReadKIND() + bool ReadKIND(bool bInitial=false) { bool bHasNew = false; @@ -282,6 +283,9 @@ namespace NewsCrawler string strXPath = "//item"; var lists = doc.DocumentNode.SelectNodes(strXPath); + if(lists == null) + return false; + foreach(var item in lists) { string strTitle = item.SelectSingleNode(".//title").InnerText; @@ -298,25 +302,7 @@ namespace NewsCrawler continue; } - if(m_ItemList.Any(c => c.m_strURL==strURL)==false) - { - NEWS_ITEM news = new NEWS_ITEM(); - news.m_strTitle=strTitle; - news.m_Time=DateTime.ParseExact(strTime, "HH:mm:ss", CultureInfo.CurrentCulture); - news.m_strURL=strURL; - news.m_strReference="KIND"; - - lock(m_ItemList) - { - m_ItemList.Add(news); - } - - bHasNew=true; - } - else - { - break; - } + InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "KIND"); } } } @@ -337,8 +323,8 @@ namespace NewsCrawler if(chAutoReload.Checked == true) { ReadKIND(); - ReadDart(); - ReadAsiaE(); + ReadDart(); + ReadAsiaE(); ReadEtoday(); } @@ -346,38 +332,6 @@ namespace NewsCrawler m_CrawlTimer.Enabled = true; } - private void UITimer_Tick(object sender, EventArgs e) - { - if (m_iLastItemCnt == m_ItemList.Count) - return; - - lock(m_ItemList) - { - m_ItemList.Sort((NEWS_ITEM news1, NEWS_ITEM news2) => news1.m_Time.CompareTo(news2.m_Time)); - } - - foreach (var item in m_ItemList) - { - string strResult = string.Format("[{0}] {1} ({2})", item.m_Time, item.m_strTitle, item.m_strURL); - lvList.Items.Add(new ListViewItem(new string[] { item.m_Time.ToString("HH:mm:ss"), item.m_strTitle, "", "", item.m_strReference, item.m_strURL })); - - //Console.WriteLine(strResult); - //System.IO.File.AppendAllText("output.txt", strResult+"\n", Encoding.GetEncoding("EUC-KR")); - } - - if (chAutoSelect.Checked == true) - { - lvList.Items[lvList.Items.Count - 1].Selected = true; - lvList.Select(); - lvList.SelectedItems[0].EnsureVisible(); - } - - foreach (ColumnHeader col in lvList.Columns) - col.Width = -2; - - m_iLastItemCnt = m_ItemList.Count; - } - private void lvList_SelectedIndexChanged(object sender, EventArgs e) { if (lvList.SelectedItems.Count <= 0) @@ -399,5 +353,38 @@ namespace NewsCrawler tbInterval.Text = (m_iCrawlInterval / (float)1000).ToString("##0.0") + "초"; } } + + private void lvList_ColumnClick(object sender, ColumnClickEventArgs e) + { + SortOrder Order = (lvList.Sorting == SortOrder.Descending || lvList.Sorting == SortOrder.None) ? SortOrder.Ascending : SortOrder.Descending; + + lvList.ListViewItemSorter = new ListViewItemComparer(e.Column, Order); + lvList.Sorting = Order; + lvList.Sort(); + } } + + + class ListViewItemComparer : IComparer + { + int m_iColumn = 0; + SortOrder m_Order = SortOrder.Ascending; + + public ListViewItemComparer(int column, SortOrder Order) + { + m_iColumn = column; + m_Order = Order; + } + + public int Compare(object x, object y) + { + ListViewItem item1 = (ListViewItem)x; + ListViewItem item2 = (ListViewItem)y; + if(m_Order == SortOrder.Ascending) + return string.Compare(item1.SubItems[m_iColumn].Text, item2.SubItems[m_iColumn].Text); + else + return string.Compare(item2.SubItems[m_iColumn].Text, item1.SubItems[m_iColumn].Text); + } + } + }