用Get 和 Put 语句拷贝大文件,如何设置缓存大小!!!!!急

zolen 2006-07-24 04:27:20
简单代码如下:

Const BUFSIZE = 4096

F1 = FreeFile
Open Src For Binary As F1
F2 = FreeFile
Open Dst For Binary As F2

FSize = LOF(F1)
BTest = FSize - LOF(F2)

ReDim sArray(1 To BUFSIZE) As Byte

Do
If BTest < BUFSIZE Then

ReDim sArray(1 To BTest) As Byte

End If

Get F1, , sArray
Put F2, , sArray

BTest = FSize - LOF(F2)

Doevents

Loop Until BTest <= 0

Close F1
Close F2
.......................
就上面这种方式进行文件拷贝. 小文件还无所谓,比如拷贝1G以上文件,就会严重消耗系统内存,甚至夸张得把系统内存消耗剩余到1M. 然后整个系统就变得十分缓慢. 一直要到拷贝结束后,系统内存释放后,才恢复正常.
请问有什么办法,可以设置文件缓存大小,不让它去无限透支系统内存.
上面的BUFSIZE无论改变什么大小,都不会改变状况的.郁闷ing.请高人指点一下.
...全文
339 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WM_JAWIN 2006-07-26
  • 打赏
  • 举报
回复
你的 Redim 用的过火啦~~
把它放到Do ...loop外面吧!
chb19810501 2006-07-26
  • 打赏
  • 举报
回复
国外站点找到的方法,可以自己控制内存使用,哪怕拷贝一个2G的大文件,也可以任意控制系统内存的占用,比如我就让用1M内存,就绝对不会超出.

什么方法?共享一下,非常想知道
pigsanddogs 2006-07-25
  • 打赏
  • 举报
回复
楼上各位弟兄,你试试你们的方法,拷贝一个超过1G的大文件,看看系统剩余内存会不会直线下降..不信就试试.

很明确的高速你, 。不会
vb6+sp6+win2003 server enterprise sp1
zolen 2006-07-25
  • 打赏
  • 举报
回复
我又不是不会拷贝,只是想不吃系统剩余内存,也就是不缓冲,直接写文件而已.
昨天到国外站点看了一下,终于找到解决方法.

楼上各位弟兄,你试试你们的方法,拷贝一个超过1G的大文件,看看系统剩余内存会不会直线下降..不信就试试.

国外站点找到的方法,可以自己控制内存使用,哪怕拷贝一个2G的大文件,也可以任意控制系统内存的占用,比如我就让用1M内存,就绝对不会超出.

清晨曦月 2006-07-24
  • 打赏
  • 举报
回复
刚看了看
http://community.csdn.net/Expert/topic/4679/4679944.xml?temp=7.047671E-02
这个帖子,我回了但是没回完。。。

以为这个用WINDOWS对话框复制的代码大家都知道呢。。。贴到原贴里面去了。。。郁闷啊
pigsanddogs 2006-07-24
  • 打赏
  • 举报
回复
64k作一个单位比较好。
dim byt(&h10000&-1) as byte
dim count as long
count = filelen(file1) \ &h10000&
dim i as long
open file1 for binary as #1
open file2 for binary as #1
processbar.max=count
for i = 1 to count
get #1,,byt
put #2,, byt
processbar.value = i
doevents
next i
if filelen(file1) % &h10000&>0
dim aaaaaa() as byte
redim aaaaaa((filelen(file1) % &h10000&)-1)
get #1,,aaaaaa
put #2,,aaaaaa
endif
close #1
close #2

清晨曦月 2006-07-24
  • 打赏
  • 举报
回复
就上面这种方式进行文件拷贝. 小文件还无所谓,比如拷贝1G以上文件,
比如拷贝1G以上文件。。。楼主没测试过吧?以前模仿了笨笨狗分肉器的全部功能用的就是这个办法,当时测试过但测试结果不知道哪去了,根本容纳不到上G,好象是300M左右的时候就溢出了。么办法,前一段写程序把系统搞瘫痪包括分区什么的都没了,用FINDDATA恢复了一天,但是有些文件还是丢了。。

我真的也很奇怪,为什么不直接FILECOPY,不过你这程序可以换个方法想想,何必一起都读进来呢,读一部分吧,也好,GET语句在MSDN中有如下说明:
Get 语句


将一个已打开的磁盘文件读入一个变量之中。

语法

Get [#]filenumber, [recnumber], varname

Get 语句的语法具有以下几个部分:

部分 描述
filenumber 必要。任何有效的文件号。
recnumber 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件),以表示在此处开始读出数据。
varname 必要。一个有效的变量名,将读出的数据放入其中。
那也就是说,你可以先取文件大小(OPEN语句打开一次就可以知道了),然后读一部分进来,例如256M,把这256M写完再读256M直到读写完成(用读出来的大小来设置最后一次读的大小,REDIM SARRAY)。

这样就不会消耗过多内存而且也不会溢出了,还可以显示进度。。。

但是我真的还很奇怪,为什么不直接COPY,即使直接COPY也可以调用系统的拷贝对话框来显示进度。
还想懒够 2006-07-24
  • 打赏
  • 举报
回复
看看这个贴子

http://community.csdn.net/Expert/topic/4679/4679944.xml?temp=7.047671E-02
zolen 2006-07-24
  • 打赏
  • 举报
回复
filecopy也占用内存厉害啊. 主要是我要做拷贝进度条.
VirtualDesktop 2006-07-24
  • 打赏
  • 举报
回复
奇怪了
为什么不直接filecopy ???
zolen 2006-07-24
  • 打赏
  • 举报
回复
up
zolen 2006-07-24
  • 打赏
  • 举报
回复
看到好多软件可以设置缓存大小,拷贝文件的时候,就真的不会太占用系统内存.
我用filecopy copyfile copyfileex fso ...等等,包括windows自己的拷贝复制,都会严重消耗内存.
那个文件缓存到底这么设置,才能控制不去无限透支系统内存啊???????

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧