Open App.Path & "\SendMessage.txt" For Input As #iFile
          Do
            DoEvents
                  Line Input #iFile, astr
                  Text1.Text = Text1.Text + astr + vbCrLf
          Loop Until EOF(iFile)
          Close iFile
          EndTime = GetTickCount
          Debug.Print EndTime - StartTime
要读取的文件大小为 31.4kb ,读取时间要2万多毫秒,也太慢了吧,各位大侠,用什么方法达到读取速度更快的目的,
有一些专用处理文本的软件打开一个有十几万行约为2M的文件只要估计1秒不到的时间。

解决方案 »

  1.   

    用富文本框控件一次打开完毕,31.4kb 算个啥,很快.
    富文本框有个Filename属性.
      

  2.   

    慢的关键在于循环中的
    Text1.Text = Text1.Text + astr + vbCrLf
    你先定义一个string变量,dim strTemp As String
    strTemp = strTemp + astr + vbCrLf'//先存到内存中
    在循环结束后再:Text1.Text=strTemp
      

  3.   

    如果文件不是太大,最好把doevents去掉,这个也耽误时间
      

  4.   

    如果用C来实现就超级快了 HANDLE hFile = CreateFile("C:\\FileList.txt",
      GENERIC_READ | GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      0,
      NULL
      );
    if (hFile!=INVALID_HANDLE_VALUE)
    {
    DWORD dwFileSize = GetFileSize(hFile,NULL);
    HANDLE hMap = CreateFileMapping(hFile,
    NULL,
    PAGE_WRITECOPY,
    0,
    0,
    NULL
    );
    if (hMap)
    {
    PVOID FileMap = MapViewOfFile(hMap,
      FILE_MAP_COPY,
      0,
      0,
      0
      );
    if (FileMap)
    {
    LPSTR lpBuffer = (LPSTR)FileMap;
    LPSTR lpPrev=lpBuffer;
    while (lpBuffer-(LPSTR)FileMap<dwFileSize)
    {
    if (*lpBuffer=='\r' && *(lpBuffer+1)=='\n')
    {
    *lpBuffer=0;
    printf("%s\n",lpPrev);
    lpPrev = lpBuffer+2;
    }
    lpBuffer++;
    }
    UnmapViewOfFile(FileMap);
    }
    CloseHandle(hMap);
    }
    CloseHandle(hFile);
    }
      

  5.   

    呵呵!看看vb多少行,C用多少行。vb使用起来的便利性肯定是需要损失一些效率了!
      

  6.   

    大家可以测试一下要快很多,原因相信大家都知道,C可以用指针,而且VB的字符串连接速度真的不敢恭维
      

  7.   

    Text1.Text = Text1.Text + astr + vbCrLf就慢在这一句上了
      

  8.   

    才三十四K,循环读个啥啊晕..............一次读入不就结了么........Open App.Path & "\SendMessage.txt" For binary As #iFile
              astr=space(lof(1))
              get #iFile, ,astr
              Text1.Text =  astr 
    Close iFile
    EndTime = GetTickCount
    Debug.Print EndTime - StartTime
    10M以内都可以这么读,速度根本就不用考虑.
      

  9.   

    简单一点的办法是使用二进制方式打开文件并一次读入完毕,代码如下:
    Open App.Path & "\SendMessage.txt" For Binary As #iFile
    Text1.Text = InputB(LOF(iFile), iFile)
    Close #iFile
    复杂一点的是使用API,因为API可以设置文件读取模式,比如只读比读写要快得多(VB二进制方式时默认为读写模式),因为读写模式需要锁定。
    再复杂一点是使用陈辉所说的文件影射,这对大文件可以加快速度。
      

  10.   

    字符串连接注意一下细节也可以提高速度
    Private Sub Command1_Click()
        Dim i As Long
        Dim s As String
        Dim t As String
        t = "123"
        Debug.Print Time
        For i = 0 To 40000
            s = s & t & vbcrlf '这种连接方式需要10秒才能完成整个循环
            s = s & (t & vbcrlf)'加个括号,时间缩短到5秒
        Next
        Debug.Print Time
    End Sub
      

  11.   

    Private Sub Command1_Click()
    For i = 1 To 20000
    temp = temp & "项目" & i & vbCrLf
    Next
    Open "d:\13.txt" For Output As #1
    Print #1, temp
    Close
    End Sub
    Private Sub Command2_Click()
    ifile = FreeFile
    Open "d:\13.txt" For Binary As #ifile
    Text1.Text = Input(LOF(ifile), ifile)
    Close #ifile
    Close
    End Sub为什么这样子只能读后8千多行呢?。
      

  12.   

    心情正常了?-----------------------------------------------------------
    赞老马的办法,慢就慢在拼接字符串上了。每一次拼接都是一次内存拷贝。另外sp6以前的Textbox内容长度都有限制,不可用。
      

  13.   

    我试过用richtextbox打开10M以上的文本文件约1秒多点(凭感觉)。我只想知道,我的这种写法为什么读不了两万行。上面的代码生成的13.txt文件有两万行,Private Sub Command2_Click()只能读出8330行,可是8330行的大小已经超过32K。只想知道是为什么,如果在temp = temp & "项目" & i & vbCrLf行的“项目”前面加入几个空格符,读出来的行数更少。
    人太多,分数不够分,加了20分啊!继续求解。
      

  14.   

    实际上,用 For Binary 与 For Input 方式打开,还有一个显著的区别。对于 For Input,VB 会将整个文件读入虚拟内存。如果文件容量超过了物理内存分配,就会进入磁盘交换。因此,读大文件会“假死”很长时间。而 For Binary 是不会自动读磁盘文件的。因此打开后,可以立即执行后续的语句。对于超大文件,我一般采用分段读取,分段处理的方式。主要注意将段末的不完整行留出,交给下一段处理即可。对于小文件,其实可以用 For Input 方式打开,一次性读入变量中。把 Line Input 循环,改成 Input 就好了。
      

  15.   

    不知道怎么用文件影射,C代码我是半点也看不来。能给个VB的例子吗?
      

  16.   

    richtextbox放二万行应该没问题吧?
    textbox是有限制的,至于是不是32K不清楚....
      

  17.   

    richtextbox效率远远高于textbox,显示大文件首选前者...
      

  18.   

    Private Sub Command1_Click() 
        Dim i As Long 
        Dim s As String 
        Dim t As String 
        t = "123" 
        Debug.Print Time 
        For i = 0 To 40000 
            s = s & t & vbcrlf '这种连接方式需要10秒才能完成整个循环 
            s = s & (t & vbcrlf)'加个括号,时间缩短到5秒 
        Next 
        Debug.Print Time 
    End Sub =====================================================================================
    这个实际上是把两个长串连接中的一个变为短串连接。但是你想过没有,你的例子写得不好,因为在这个例子中后一个连接没有必要在循环中重复。Private Sub Command1_Click() 
        Dim i As Long 
        Dim s As String 
        Dim t As String 
        t = "123" & vbcrlf
        Debug.Print Time 
        For i = 0 To 40000 
            s = s & t   '这种连接方式更快,把末尾的连接省了 
        Next 
        Debug.Print Time 
    End Sub 如果我来做,会将每行数据放入一个字符串数组元素。例如 t()。再用 Join 连接。而不会用循环做字符串连接。Dim t(40000) As String
    For i = 0 To 40000
    t(i) = "123"
    Next i
    s = Join(t, vbCrLf)
      

  19.   

    为什么不用强大的FSO呢
    Dim fso As New FileSystemObject, objTS As TextStream
    Set objTS = fso.OpenTextFile("d:\13.txt", ForReading)
    Debug.Print objTS.ReadAll
      

  20.   

    FileSystemObject不是VB内置的,新建一个FileSystemObject对象
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set objts = fso.OpenTextFile("d:\13.txt", 1)
    Debug.Print objts.readall
    objts.readall'超出文件尾
      

  21.   

    FileSystemObject不是VB内置的,新建一个FileSystemObject对象
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set objts = fso.OpenTextFile("d:\13.txt", 1)
    Debug.Print objts.readall
    objts.readall'超出文件尾
      

  22.   

     VB编程突破64K的文本框显示限制:  http://read.pudn.com/downloads12/sourcecode/windows/mulmon/50716/VB%B1%E0%B3%CC%D6%D0%CD%BB%C6%C664K%B5%C4%CE%C4%B1%BE%CF%D4%CA%BE%CF%DE%D6%C6/64KText/64KText.frm__.htm
      

  23.   

    Private Sub Command1_Click()
    Dim fso As New FileSystemObject, objTS As TextStream
    Set objTS = fso.OpenTextFile("d:\13.txt", ForReading)
    Debug.Print objTS.ReadAll
    End SubPrivate Sub Form_Load()
    Open "d:\13.txt" For Binary As #1
        Put #1, 40000000, 96
    Close #1
    End Sub
    我读了一个38M的文件,也没有出现“超出文件尾”的问题啊!
    还有,你引用了FSO,就不用Createobject了
      

  24.   

    会不会是"BIOS电池没电"病毒.......?
      

  25.   

    我曾经用FSO,但是去速度比input要慢很多,是我没有正确使用?
      

  26.   

    现过几天,如果开不了机,哪就是BIOS电池没电了
      

  27.   

    速度慢应该和用+号连接字符串有关。 VB中用+或者&符号连接字符串时,每次的连接都会进行字符串的深度复制,会涉及多次的内存分配、销毁、复制等耗时操作,影响性能是肯定的。 更不要说你这个代码中还涉及窗体控件的刷新等操作。可以将数据一次性读入数组,在程序中解析完成后再将结果写入窗体控件。几十K的数据几乎不会产生耗时。
      

  28.   

    现在是有点明白了,应该是东方之珠说的  textbox控件64K限制。我试了一下,用二进制读了一个20M的文件,再用二进制把读出来的文件写到一个新的文件里面,耗时很少。要是让读出来的文件显示在TEXT里面就会显示不全。所以 应该是东方之珠说的  textbox控件64K限制谢谢大家了。 
      

  29.   

    另外
    为什么  for 循环比 do while 循环快一半以上。
    例如
     for i=1 to 999999999
     a=a+1
    next
    do while a<999999999
    a=a+1
    loop
    得到结果是 for 比 do 快一半以上。why????
      

  30.   

    另外
    为什么  for 循环比 do while 循环快一半以上。
    例如
     for i=1 to 999999999
     a=a+1
    next
    do while a<999999999
    a=a+1
    loop
    得到结果是 for 比 do 快一半以上。why????
      

  31.   

    do while多了一个判断, for 是直接循环
      

  32.   

    应该是do while在每轮询一次就会产生一个判断,也就意味着多出999999999条判断指令,  for 应该是寄存器直接累加,