【问题标题】:read text file chunks by chunks by scrollbar [closed]通过滚动条逐块读取文本文件块[关闭]
【发布时间】:2013-08-09 10:15:24
【问题描述】:

您好,我已经阅读了这个问题:

Reading very large text files, should I be incorporating async?

我挖了网,尤其是堆栈溢出!

结果是 14 种方法可以做到这一点,但没有一个是不完整的!

在最后 2 天里,我正在研究这个并测试和基准测试了 14 种方法。

例如:

        private void method()
        {

        FileStream FS = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);

        int FSBytes = (int) FS.Length;

        int ChunkSize = 24;

        byte[] B = new byte[ChunkSize];

        int Pos;

        for (Pos = 0; Pos < (FSBytes - ChunkSize); Pos += ChunkSize)

        {

        FS.Read(B,0 , ChunkSize);
        string content = System.Text.Encoding.Default.GetString(B);

        richTextBox1.Text=content=;


        }

        B = new byte[FSBytes - Pos];

        FS.Read(B,0, FSBytes - Pos);
        string content2 = System.Text.Encoding.Default.GetString(B);

        richTextBox1Text=content2;


        FS.Close(); 
        FS.Dispose();
        }

5mb的文本文件,时间太长,怎么办?

【问题讨论】:

  • please help me with example code to do this 首先you展示,到目前为止你做了什么。
  • 您希望用户滚动浏览 1Gb 的文本?我认为你需要重新考虑你的方法。
  • 这太不切实际了。我会先使用 C 将文件分成多个块,然后允许用户使用按钮在这些块之间导航。
  • @MikeW 这种方法有什么问题。在过去,人们使用类似的技巧来编辑使用有限内存(例如 4K 或 64K)的大文件。
  • @FKunecke 我假设您可以证明C有效,而不是重复一些信念。(尤其是当文件 I/O 存在问题时)跨度>

标签: c# winforms textbox chunks


【解决方案1】:

这是一个工作示例,它读取每个流的文本文件以完成您想要做的事情。我用一个 100 MB 的文本文件对其进行了测试,它运行良好,但你必须看看更大的文件是否也能运行。

这是一个例子。只需将 RichTextBox 带入您的表单和 VScrollBar。然后使用硬盘“C:”上的文件“test.txt”。

public partial class Form1 : Form
{
    const int PAGE_SIZE = 64;   // in characters
    int position = 0;  // position in stream

    public Form1()
    {
        InitializeComponent();
    }

    private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
    {
        position = e.NewValue * PAGE_SIZE;

        ReadFile(position);    
    }

    private void ReadFile(int position)
    {
        using (StreamReader sr = new StreamReader(@"C:\test.txt"))
        {
            char[] chars = new char[PAGE_SIZE];
            sr.BaseStream.Seek(position, SeekOrigin.Begin);
            sr.Read(chars, 0, PAGE_SIZE);

            string text = new string(chars);
            richTextBox1.Text = text;
        }    
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ReadFile(position);
    }
}

【讨论】:

  • 不会richTextBox1.Text = text;用新值替换旧值?
  • 是的。当您滚动时,RichTextBox 的内容会被新的“页面”替换。
  • 像这样获取文件中的字符数:stackoverflow.com/questions/8214772/… 然后将该数字除以 PAGE_SIZE。您可能必须使用 Math.Ceiling() 对结果进行四舍五入。所以它会是这样的: vScrollBar1.Maximum = Math.Ceiling(NumberOfCharacters / PAGE_SIZE);
  • 回车、换行以及两者的组合是 ReadLine() 的标识符,用于标识行尾。 msdn.microsoft.com/en-us/library/… 所以你必须扩展你的代码,以便它读取字符直到这些字符。之后,您必须相应地更新“位置”。
  • @Kai Hartmann:+1 给你。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-06-22
  • 2019-04-29
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多