我晕倒,CopyFile函数拷贝大文件的时候非常占用资源,大家有没有能节省系统资源的办法勒?
CopyFile一个大文件,经常会使程序停止响应,Copy完成以后不重新启动系统还很慢,
慢点拷贝文件无所谓,起码让我在拷贝文件的时候能干点其他的事情不?

解决方案 »

  1.   

    独立线程控制,那才可以_____________________
    http://lysoft.7u7.net
      

  2.   

    很简单啊:
    function myCopyFile(Source, Dest: string): Boolean;
    var
      f1, f2, len: Integer;
      Buffer: string;     { 不定义成buffer: array [0..8192*1024] of char 是因为delphi中分配过大的栈空间时编译器生成的是一个push指令的循环而不是直接设置esp, 效率太低}
    begin
      result := false;
      setlength(Buffer, 8192*1024);  // 开8兆缓存
      f1 := fileopen(source, fmOpenRead or fmShareDenyNone);
      if f1 >= 0 then
      try
        f2 := filecreate(dest);
        if f2 >= 0 then
        begin
          repeat
            len := fileread(f1, buffer[1], 8192*1024);
            if len > 0 then
              filewrite(f2, buffer[1], len);
          until (len <= 0);
          result := true;
          fileclose(f2);
        end;
      finally
        fileclose(f1);
      end;
    end;
      

  3.   

    buffer: array [0..8192*1024] of char;
    不用用循环的PUSH 来分配栈的。至少在D6不是,以前的版本就不清楚了,但是我相信也不会是。
    PUSH 一次分配4个字节,得循环多少次啊,我相信Borland不会这么干。
      

  4.   

    至少D7会.
    我也是偶然发觉的. 一个子函数定义了一块4M的局部变量, 结果发觉运行时卡了一会然后报堆栈溢出错. 结果打开CPU窗口一看, 差点晕倒, 发觉它函数入口处竟然是个循环PUSH语句.
      

  5.   

    用SHFILEOPSTRUCT对象来实现,好象速度跟你在系统中Ctrl+C&Ctrl+V是一样的