item insert 구조 수정, sort 추가

This commit is contained in:
2016-09-19 07:53:21 +09:00
parent 865e5f7ec9
commit 3b8b8dc4e7
2 changed files with 120 additions and 132 deletions

1
Form1.Designer.cs generated
View File

@@ -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

247
Form1.cs
View File

@@ -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<NEWS_ITEM> m_ItemList = new List<NEWS_ITEM>();
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();
}
bool ReadAsiaE()
m_CrawlTimer.Elapsed+=CrawlTimer_Tick;
m_CrawlTimer.Interval=m_iCrawlInterval;
m_CrawlTimer.Start();
}
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");
}
}
}
@@ -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);
}
}
}