我一直在使用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;
}
}
答案 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);
}