none
读取日志工具,计算时间方法第二次没有进方法体,直接默认值了,请高手帮忙解决,不甚感激!!! RRS feed

  • 问题

  • 我写了一个读取日志的工具,计算日志中例如预处理开始到预处理结束总共花了多长时间。

    其中通过一个returnTure方法比对“预处理开始”这样的字段,平且返回预处理开始这个时间。

    执行过程中预处理开始到预处理结束计算是对的,在第二次计算批处理开始到批处理结束的时候。批处理开始没有进returnTure这个方法体。这是为什么。而批处理结束却有进去。

    请高手帮忙看下,另外能否指定下,下次我这样碰到问题该如何着手解决,解决问题的思路应该是怎么样的?

    先在这里拜谢了!

    代码如下:

         private void btnRead_Click(object sender, EventArgs e)
            {
                XmlDocument xmlDoc = new XmlDocument();
                List<Item> itemList = new List<Item>();
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.IgnoreComments = true;//忽略文档里面的注释
                XmlReader reader = XmlReader.Create(@"..\..\TxtToExcel.xml", settings);
                xmlDoc.Load(reader);
                XmlNode xn = xmlDoc.SelectSingleNode("XMLItem");
                XmlNodeList xnl = xn.ChildNodes;
               
               
                foreach (XmlNode xn1 in xnl)
                {
                    Item item = new Item();
                    XmlElement xe = (XmlElement)xn1;
                    XmlNodeList xnl0 = xe.ChildNodes;
                    item.Start = xnl0.Item(0).InnerText;
                    item.End = xnl0.Item(1).InnerText;
                    
                    TimeSpan dtStart = new TimeSpan(retrunTrue(item.Start).Ticks);//就是这里第二次批处理开始的时候没有进方法
                    TimeSpan dtEnd = new TimeSpan(retrunTrue(item.End).Ticks);
                    TimeSpan ts = dtEnd.Subtract(dtStart).Duration();
                    item.Time = ts.Days.ToString() + "天" + ts.Hours.ToString() + "时" + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒";//时间 
                    itemList.Add(item);
                  
                   
                   
                }
                
                reader.Close();
                
               
                for (int i = 0; i < itemList.Count; i++)
                {
                    ListViewItem litem = new ListViewItem();
                    litem.SubItems.Clear();
                    litem.SubItems.Add(itemList[i].Start);
                    litem.SubItems.Add(itemList[i].End);
                    litem.SubItems.Add(itemList[i].Time);
                    listView1.Items.Add((ListViewItem)litem.Clone());//(ListViewItem)litem.Clone()
                }
                for (int i = 0; i < listView1.Items.Count; i++)
                {
                    listView1.Items[i].SubItems[0].Text = (i + 1).ToString();
                }
            }
            private void btnSave_Click(object sender, EventArgs e)
            {
            }
            public DateTime retrunTrue( string b)
            {
                DateTime dt1 = DateTime.Now;
               
                    string path = txtDir.Text;
                    if (path == null) MessageBox.Show("路径不能为空,请选择日志文件!");
                       
                    StreamReader sr = new StreamReader(path, Encoding.GetEncoding("gb2312"));
                    string str = null;
                    ArrayList arrText = new ArrayList();
                    
                    while ((str = sr.ReadLine()) != null )
                    {
                        
                        arrText.Add(str);
                        
                    }
                    sr.Close();
                    for (int i=0;i<arrText.Count ;i++)
                    {
                        string aa = Convert.ToString(arrText[i]);
                        
                        string time = null;
                        string cccc=null;
                        int l = b.Length;
                        if (l == (aa.Substring(21)).Length)
                        {
                            cccc = aa.Substring(21, l);
                            if (cccc.Equals(b))
                            {
                                time = aa.Substring(1, 19);
                                MessageBox.Show(time.ToString ());
                                dt1 = Convert.ToDateTime(time);
                                break;
                            }
                        }
                    }
              
                
                return dt1;
            }
     

    //定义的基础类

    public class Item { private string start; private string end; private string time; public string Start { get { return start; } set { start = value; } } public string End { get { return end; } set { end = value; } } public string Time { get { return time; } set { time = value; } } }

    XML如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <XMLItem>
      <Item>
        <Start>预处理开始</Start>
        <End>预处理完成</End>
       </Item>
      <Item>
        <Start>批处理开始</Start>
        <End>批处理完成!</End>
      </Item>
    </XMLItem>

    日志文件如下:

    [2012-12-07 16:33:08]预处理开始
    [2012-12-07 16:35:10]预处理结束
    [2012-12-08 11:33:08]批处理开始
    [2012-12-09 16:35:10]批处理结束

    2013年1月4日 11:31

答案

全部回复

  • 你给的数据有问题吧,一个叫完成,一个叫结束。 最简单的办法就是单步跟踪。

    http://feiyun0112.cnblogs.com/

    2013年1月4日 13:27
    版主
  • 读取 XML 的方法没有问题,retrunTrue 每次都会被调用,所以并不是你说的“批处理开始没有进returnTure这个方法体”,我估计你也就是从界面上看到的情况来得出这样的结论的。因此你的问题是 returnTrue 在处理“批处理开始”时失败了,请自己检查些为什么失败。

    请你学会程序调试方法,不要像普通用户那样仅仅凭看到的东西就得出结论。

    • 已标记为答案 fanjeff 2013年1月5日 5:01
    • 取消答案标记 fanjeff 2013年1月5日 5:01
    2013年1月5日 1:36
  • 已发现问题了,逐步语句执行下去知道了,程序没有问题!

    • 已标记为答案 fanjeff 2013年1月5日 5:01
    2013年1月5日 4:57