UltraEdit:有传统的读进内存和不读进内存,谈那种不读进内存的方式,用的是把文件当内存映射还是根据滚动条(好像也是单独的滚动条,不是文本框自带的那个)状态即使定位文件流读取数据或其它方式?
WinHex:这个更是神速了,开几G的文件,怎么拉滚动条定位连半点延迟都没有!
咋回事了,两样能比较简单的实现一样就可以,麻烦知道的给点思路把!我用C#

解决方案 »

  1.   

    是发送消息。自己搜下Windows消息大全。
      

  2.   

    使用流读取,显示的时候不是所有的数据都显示到文本框中,先计算载入的文本行数,除显示行数,来做滚动,滚动到相应的位置显示相应的行。WinHex应该是按一定尺寸划分的流。
      

  3.   

    有兄弟知道有实现类似功能的控件吗,源码最好,我想研究下,要求不高,能达到比较好的速度在1G物理内存+1G虚拟内存下打开1G流畅文件就行!
    全载入文本框是完全排除的,那样顶多100MB!
    看来多半要类似listview那种虚拟载入,不用不载,用啥载啥的办法!
    还有数据库也是那么玩的!
    但不管怎么说!差不多功能,WinHex的速度简直就是光速,没用过的人试下,打开几个G的文件,估计与开几十G的没有区别,让用户的速度感就像用计事本打开几K的文件差不多!
    大家一起想想,提供一些好的思路,咋们实现了它!以后一定用的着!
      

  4.   

    function   GetTextLine(szFile:TFileName;   var   nLine:Integer):string;
      var
          f:TextFile;
          i:Integer;
      begin
          i:=0;
          Assign(f,   szFile);
          Reset(f);
          if   nLine=-1   then
              while   not   Eof(f)   do
              begin
                    Inc(i);
                    ReadLn(f,   Result);
              end
          else
              while   (not(Eof))and(i<nLine)   do
              begin
                  Inc(i);
                  ReadLn(f,   Result);
              end;
          CloseFile(f);
          nLine:=i;
      end;
    我用过这个函数,网上找到,速度很快,读取指文本指定行,先计算文本的总行数,自己做滚动条,用总函数和现实的行数来确定滚动条的步进大小,再读取一定范围行数的文本,比如连续10行或者20。
    其它文件划分数据块,滚动条用来指定读取流动起始位置和偏移,和这个类似,你先试试。
      

  5.   

    有空的时候看看,我也没写过,只是用流载入过文本,200多兆文本1-2秒载入。可以试试。 
    这个是局部载入,全载入的话,要10-20秒.我已经自己实现,也是光速光速!其实是很简单的,只是没动手,想的太多了,跟我之前猜测一样,就是流定位读很少的部分仍然感谢大家的发言.哎现在的心太不好,这么简单的问题说一下,兄弟门都要少走不少弯路,虽然都是地球人,但那个不小心
    真的成了billgates不但不会影响你的饭碗,遇到像我这样的一定还会报答你!关键代码,只测试了下,整行判断等其它东西我慢慢加全!写功能还没加!但速度光速!大家开个几G的文件看下!少走弯路!大家再多看看,能有啥新思路和想法,一起讨论提高提高!:
    (\r\n问题,\n富文本框当作换行和文本框不当作换行,\r\n都当作!)
            private void button1_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox2.Text = openFileDialog1.FileName;
                    fs = new FileStream(textBox2.Text, FileMode.Open, FileAccess.Read);
                    vScrollBar1.Maximum = (int)fs.Length;
                }
            }
            private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
            {
                try
                {
                    fs.Seek(e.NewValue, SeekOrigin.Begin);
                    int nBytes = 2048;
                    byte[] ByteArray = new byte[nBytes];
                    int nBytesRead = fs.Read(ByteArray, 0, nBytes);
                    richTextBox1.Text = Encoding.ASCII.GetString(ByteArray);
                }
                catch
                {            }
            }