Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过滚动条逐块读取文本文件块_C#_Winforms_Textbox_Chunks - Fatal编程技术网

C# 通过滚动条逐块读取文本文件块

C# 通过滚动条逐块读取文本文件块,c#,winforms,textbox,chunks,C#,Winforms,Textbox,Chunks,嗨,我读过这个问题: 我挖了网,尤其是堆栈溢出 结果是有14种方法可以做到这一点,但没有一种是不完整的 在过去的两天里,我正在研究这一方法,并测试和基准测试了14种方法 例如: private void method() { FileStream FS = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); int FSBytes = (int) FS.Leng

嗨,我读过这个问题:

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

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

在过去的两天里,我正在研究这一方法,并测试和基准测试了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();
        }
private void方法()
{
FileStream FS=newfilestream(路径,FileMode.Open,FileAccess.ReadWrite);
int FSBytes=(int)FS.Length;
int ChunkSize=24;
字节[]B=新字节[ChunkSize];
int Pos;
对于(Pos=0;Pos<(FSBytes-ChunkSize);Pos+=ChunkSize)
{
FS.Read(B,0,ChunkSize);
string content=System.Text.Encoding.Default.GetString(B);
richTextBox1.Text=content=;
}
B=新字节[FSBytes-Pos];
FS.Read(B,0,FSBytes-Pos);
string content2=System.Text.Encoding.Default.GetString(B);
richTextBox1Text=content2;
FS.Close();
FS.Dispose();
}

对于5mb文本文件,它花费的时间太长,我应该怎么做?

这是一个每个流读取一个文本文件以完成您尝试执行的操作的工作示例。我用一个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);
    }
}

请使用示例代码帮助我执行此操作
首先,您展示了您迄今为止所做的工作。您想让用户滚动1Gb的文本吗?我认为你需要重新考虑你的方法。这太不切实际了。我会先使用C将文件分割成多个块,然后允许用户使用按钮在这些块之间导航。@MikeW这种方法有什么问题。在过去,人们使用类似的技巧,使用有限的内存(如4K或64K)编辑大型文件。@FKunecke我想你可以证明
C
更有效,而不是重复某些信念。(尤其是当文件I/O有问题时)richTextBox1.Text=Text;用新值替换旧值?是。滚动时,RichTextBox的内容将替换为新的“页面”。按如下方式获取文件中的字符数:然后将该数字除以页面大小。您可能需要使用Math.Ceiling()来对结果进行取整。所以它可能是这样的:vScrollBar1.Maximum=Math.天花板(NumberOfCharacters/PAGE_SIZE);回车符、换行符以及两者的组合是ReadLine()的标识符,用于标识行尾。因此,您必须扩展代码,以便它读取字符直到这些字符。之后,您必须相应地更新“位置”。@Kai Hartmann:+1。谢谢