c#listview虚拟读取线未加载日志文件> 100MB

时间:2012-10-09 13:50:27

标签: c#

我一直在使用listview中的虚拟模式,我正在尝试读取大约300mb的日志文件,这是我的代码到目前为止。它在加载时冻结,但我使用虚拟模式,只在需要时调用readlines。我觉得我错过了什么,有人帮忙吗?

public partial class Form1 : Form
{

    private const int maxLines = 100;
    List<string> list = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
        {
            foreach (string s in openFileDialog1.FileNames)
            {
                listBox1.Items.Add(s);
            }
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        listView1.VirtualMode = true;
        listView1.VirtualListSize = maxLines;

        PropertyInfo aProp = typeof(ListView).GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance);
        aProp.SetValue(listView1, true, null);
    }


    private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
    {
        ListViewItem lvi = new ListViewItem();
        lvi.Text = retrieveItem(e.ItemIndex);
        listView1.VirtualListSize = addList(textBox1.Text);
        ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();
        NumberFormatInfo nfi = new CultureInfo("de-DE").NumberFormat;
        nfi.NumberDecimalDigits = 0;
        lvsi.Text = e.ItemIndex.ToString("n", nfi);
        lvi.SubItems.Add(lvsi);
        e.Item = lvi;
    }

    string retrieveItem(int index)
    {
        list.Clear();
        addList(textBox1.Text);
        return list[index];
    }

    int addList(string keyword)
    {
        list.Clear();
        int counter = 0;
        foreach (string line in File.ReadLines("test.log"))
            {
                if (line.Contains(keyword))
                {
                    list.Add(line);
                    counter++;
                }
            }
        return counter;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ListViewItem foundItem = listView1.FindItemWithText(textBox1.Text, false, 0, true);
        if (foundItem != null)
        {
            listView1.TopItem = foundItem;
        }
    }

1 个答案:

答案 0 :(得分:0)

使用streamReader而不是file.readline来获取文件内容,因为如果您遇到内存问题,这将有所帮助。您还可以使用asynchfilestream对象。

        using (StreamReader sr = new StreamReader(path)) 
        {
            while (sr.Peek() >= 0) 
            {
                Console.WriteLine(sr.ReadLine());
            }
        }

如果你可以使用更新的4.5技术

        String result;
        using (StreamReader reader = File.OpenText("existingfile.txt"))
        {
            Console.WriteLine("Opened file.");
            result = await reader.ReadLineAsync();
            Console.WriteLine("First line contains: " + result);
        }
相关问题