做了个读文本的小程序,一行一行的读,用dataGridView显示出来。发现大开大一点的文件会比较慢(100M,大约20秒的样子),虽然很少会去打开这么大的,但是想问下向word那样有个整体的进度,滚动条拉到哪就读到哪里是怎么做到的?
大家有点想法都说说哈~

解决方案 »

  1.   

    边读边处理,不要全部放到内存中
    new Thread((ThreadStart)delegate
        {
            StreamReader sr = new StreamReader(FileName, Encoding.GetEncoding("gb2312"));
            int line = 0;
            string line= sr.ReadLine();
            while (line!="")
            {
                line= sr.ReadLine();
            }
            sr.Close();
        }).Start();
    http://www.codeproject.com/KB/database/CsvReader.aspx
      

  2.   

    既然你本身就是一行行读的,就应该就不是读的问题了,而是你将100M的文件都显示出来的原因吧。100M的内容用20秒显示出来算快的了。
    word及urltraedit之类的软件能快速打开大文件,肯定是不会一次性全部读取的,我没研究过,但觉得应该只读取了当前需要显示出来的一部分及后续可能显示的一部分,其它的部分类容只是在后台做索引,当滚动条滚动到那个地方的时候再根据索引快速定位读取显示那一部分。
      

  3.   


                FileStream fs = new FileStream("c:\\abc.txt", FileMode.Open, FileAccess.Read);
                fs.Position = 40000000;         // 读取的内容的开始位置
                byte[] buffer = new byte[100];  // 缓存数据的buffer
                fs.Read(buffer, 0, 90);         // 读取数据
                fs.Close();想读哪儿读哪儿,想读多少就读多少。
      

  4.   


    用FileStreamFileStream   fw   =   new   FileStream(newFileName,   FileMode.Append,   FileAccess.Read,   FileShare.Read); 
    fw.Seek(1024,   SeekOrigin.Begin); 
    fw.Read(myByte,   0,   myByte.Length); 不仅可以随机读写,还可以用异步方式 
    fw.BeginRead(myData.Buffer,   0,   assignSize,   new   AsyncCallback(AsyncRead),   myData); 这样可以实现多线程同时读写文件
      

  5.   

    正好我也在看这方面的东西。楼上的说得都不清楚,大文本的实现原理不仅是分段读取,还有一个操作是块填充。你可以看看这个开源ICSharpCode.TextEditor项目,它可以快速打开任意大文件,而且不会有计事本的那种打开大文件的半天打不开的问题。计事本应该是把文字一次全画上去的。块填充的目的是让你滚动的时候能准确滚动到指定位置。ICSharpCode.TextEditor这个东西还是有一些小问题的,不过整体不影响。比如因为是分段,无法预料所有文本的宽度,所以滚动条会出现长短不一的变化。