Mat*_*Kri 7 c# textbox notepad large-files winforms
我有一个大文本文件(~100MB),我将它的行保存在字符串列表中.我的Winform偶尔需要显示它的一部分,例如500,000行.
我尝试使用ListBox,RichTextBox和TextBox,但绘图花费了太多时间.
例如,TextBox需要25秒才能显示500,000行,而记事本会立即打开此大小的文本文件.
什么是最快的解决方案?
dre*_*w_w 10
为什么不打开文件流,只读前几行.您可以seek在用户滚动文件时显示并显示相应的行.关键是 - 将整个文件读入内存需要很长时间,所以不要这样做!
入门代码
以下是一个不完整的简短代码片段,但至少应该让您入门:
// estimate the average line length in bytes somehow:
int averageLineLengthBytes = 100;
// also need to store the current scroll location in "lines"
int currentScroll = 0;
using (var binaryReader = new StreamReader(new FileStream(fileName, FileAccess.Read)))
{
if (binaryReader.BaseStream.CanSeek)
{
// seek the location to read:
binaryReader.BaseStream.Seek(averageLineLengthBytes * currentScroll, SeekOrigin.Begin);
// read the next few lines using this command
binaryReader.ReadLine();
}
else
{
// revert to a slower implementation here!
}
}
Run Code Online (Sandbox Code Playgroud)
最大的诀窍是估计滚动条需要多长时间(文件中有多少行).为此,您将不得不在用户滚动时更改滚动条,或者您可以使用此文件中典型行的长度的先验知识,并基于总字节数估计长度.无论哪种方式,希望这有帮助!
关于虚拟模式的注意事项
虚拟模式是使用ListBox或类似列表控件根据需要加载项目的方法.当用户在控件内滚动时,控件将执行回调以基于索引检索项目.只有当您的数据符合以下条件时,这才是可行的解决方案:
如果您不能满足这些标准,那么虚拟模式将不会特别有用.seek无论您是否可以执行这些操作,我提供的答案都将有效.当然,如果你能满足这些最低标准,那么无论如何 - 查看列表视图的虚拟模式,你应该找到一些非常有用的信息!
| 归档时间: |
|
| 查看次数: |
1514 次 |
| 最近记录: |