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秒不到的时间。
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秒不到的时间。
解决方案 »
- Listview怎么设置让滚动条自动向下滚~~
- vb中MediaPlayer控件的无序播放
- 打印问题
- 求教!用Quartz.dll开发的播放器,声道切换的问题。
- 请教:如何将变量值作为表单名,以打开表单
- 询问DLL操作WORD的权限问题
- 谁能给我一个ado的帮助文件啊,到那里下载
- 如果在ACCESS中建立数据库,怎么连接到VB中呀???我的怎么出现数据类型不相符的 提示??
- 用拨号服务器连接连接SQL2k-A 和 SQL2K-B 时死活连不上啊!!!为什么啊???
- 那有纯中文的MSDN呢?告诉小弟一声!狂感谢!狂给分!我下类后送你一份
- 如何提取WebBrowser中网页的某段代码?
- 怎样动态卸载控件数组
富文本框有个Filename属性.
Text1.Text = Text1.Text + astr + vbCrLf
你先定义一个string变量,dim strTemp As String
strTemp = strTemp + astr + vbCrLf'//先存到内存中
在循环结束后再:Text1.Text=strTemp
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);
}
astr=space(lof(1))
get #iFile, ,astr
Text1.Text = astr
Close iFile
EndTime = GetTickCount
Debug.Print EndTime - StartTime
10M以内都可以这么读,速度根本就不用考虑.
Open App.Path & "\SendMessage.txt" For Binary As #iFile
Text1.Text = InputB(LOF(iFile), iFile)
Close #iFile
复杂一点的是使用API,因为API可以设置文件读取模式,比如只读比读写要快得多(VB二进制方式时默认为读写模式),因为读写模式需要锁定。
再复杂一点是使用陈辉所说的文件影射,这对大文件可以加快速度。
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
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千多行呢?。
赞老马的办法,慢就慢在拼接字符串上了。每一次拼接都是一次内存拷贝。另外sp6以前的Textbox内容长度都有限制,不可用。
人太多,分数不够分,加了20分啊!继续求解。
textbox是有限制的,至于是不是32K不清楚....
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)
Dim fso As New FileSystemObject, objTS As TextStream
Set objTS = fso.OpenTextFile("d:\13.txt", ForReading)
Debug.Print objTS.ReadAll
Set fso = CreateObject("Scripting.FileSystemObject")
Set objts = fso.OpenTextFile("d:\13.txt", 1)
Debug.Print objts.readall
objts.readall'超出文件尾
Set fso = CreateObject("Scripting.FileSystemObject")
Set objts = fso.OpenTextFile("d:\13.txt", 1)
Debug.Print objts.readall
objts.readall'超出文件尾
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了
为什么 for 循环比 do while 循环快一半以上。
例如
for i=1 to 999999999
a=a+1
next
do while a<999999999
a=a+1
loop
得到结果是 for 比 do 快一半以上。why????
为什么 for 循环比 do while 循环快一半以上。
例如
for i=1 to 999999999
a=a+1
next
do while a<999999999
a=a+1
loop
得到结果是 for 比 do 快一半以上。why????