加了进度条速度慢了许多,怎么办?

按字节复制文件,希望用一个进度条来显示复制进度,发现加了进度条后,复制速度比原来慢了N倍,知道是中间计算量增加的问题,但是怎么改才能让它跟原来一样呢?代码如下:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "stdio.h"

//----------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

long GetFileLen(FILE *file)
{
fseek(file,0,2);
return ftell(file);
}

TForm1 *Form1;
//----------------------------------------------------------------------fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *fp1,*fp2;
long filelen;
fp1=fopen("1.dat","rb");
fp2=fopen("2.dat","ab");

Button1->Caption=GetFileLen(fp1);

ProgressBar1->Max=GetFileLen(fp1)/(1048576);
ProgressBar1->Position=0;

fseek(fp1,0,0);

int c;
while((c=fgetc(fp1))!=EOF)
{
fputc(c,fp2);
Application->ProcessMessages();
if (ftell(fp1)%(1048576)==0)
{
ProgressBar1->Position=ProgressBar1->Position+1;
}
}
fclose(fp1);
fclose(fp2);
Form1->Close();
}
//----------------------------------------------------------------------
[1443 byte] By [wingfootedtiger-会飞的老虎] at [2008-1-9]
# 1
一个一个字节写太慢,可以改为每4096(1000h)个或8192(2000h)个为一块,按块写入
由文件长度除以块大小,得到块数,(如果有余数,块数加一,最后一块按余数大小写入)
jiangshx-寻平阳 at 2007-10-18 > top of Msdn China Tech,C++ Builder,基础类...
# 2
用CopyFileEx吧。它提供copy进度。
pp616-坏蛋 at 2007-10-18 > top of Msdn China Tech,C++ Builder,基础类...
# 3
建议用第三方控件CopyFileEx。完全能实现楼主的需求。
pizzame-芯火 at 2007-10-18 > top of Msdn China Tech,C++ Builder,基础类...
# 4
CopyFileEx 不是什么第三方控件。那是win32 sdk里的东西。
知之为知之,不知为不知。楼上的。。。
pp616-坏蛋 at 2007-10-18 > top of Msdn China Tech,C++ Builder,基础类...
# 5
只是用词用错了罢了。楼上的太较真了。那看你这句话以你的解释又如何?
“那是win32 sdk里的东西”东西又是什么?win32 sdk里面没有什么东西吧。
楼上的,推己及人!
pizzame-芯火 at 2007-10-18 > top of Msdn China Tech,C++ Builder,基础类...
# 6
语意表达的模糊 和 表达错误是2回事。
少诡辩。根本没有可比性。
pp616-坏蛋 at 2007-10-18 > top of Msdn China Tech,C++ Builder,基础类...
# 7
本来不想留贴再争执这个无意义的话题,但是还是想澄清这个问题。想了想还是写写。
我想我还是先承认我语言确实表达失误,我更改我在2006-12-23 21:03:12上述的留言其下为:

建议楼主使用CopyFileEx--microSoft提供的一个函数,能实现楼主的要求。

使用方法见下例
#include <windows.h>
#include <conio.h>
#include <stdio.h>

DWORD CALLBACK CopyProgress(
LARGE_INTEGER TotalFileSize, // total file size, in bytes
LARGE_INTEGER TotalBytesTransferred, // total number of bytes transferred
LARGE_INTEGER StreamSize, // total number of bytes for this stream
LARGE_INTEGER StreamBytesTransferred, // total number of bytes transferred for this stream
DWORD dwStreamNumber, // the current stream
DWORD dwCallbackReason, // reason for callback
HANDLE hSourceFile, // handle to the source file
HANDLE hDestinationFile, // handle to the destination file
LPVOID lpData // passed by CopyFileEx
)
{
printf("%08X:%08X of %08X:%08X copied.\n",TotalBytesTransferred.HighPart,TotalBytesTransferred.LowPart,TotalFileSize.HighPart,TotalFileSize.LowPart);
return PROGRESS_CONTINUE;
}

int main(int argc,char **argv)
{
int Cancel=FALSE;
if(argc!=3)
{
printf("CopyEx Src Dst\n");
return 0;
}
if(!CopyFileEx(argv[1],argv[2],(LPPROGRESS_ROUTINE)CopyProgress,NULL,&Cancel,COPY_FILE_FAIL_IF_EXISTS))
{
printf("CopyFileEx() failed.\n");
return 0;
}

return 0;
}
想要过多理解请查阅MSDN”

其实我当时是想说API。而且当时我想将使用方法留下,只是时间紧张,就简单的说了一下。词语有错,我先承认我的错误。

另外,楼上的观点我仍不赞同!“知之为知之,不知为不知。楼上的。。。”你不为我,何知我不知!我为我语言表达错误认错,你是否应该为你以你自己思想去思考断定别人而认错。我奉劝你,不要以一句话来定论一个人或一件事。不然你的结论是经不住辨证的。
pizzame-芯火 at 2007-10-18 > top of Msdn China Tech,C++ Builder,基础类...