我用BCB写了个文件复制的程序,可是速度很慢,希望大家帮我一下(50分)

  • 主题发起人 主题发起人 lswhome
  • 开始时间 开始时间
L

lswhome

Unregistered / Unconfirmed
GUEST, unregistred user!
文件操作使用的都是API。
可为什么复制速度比Windows自带的慢很多呢?几乎慢一倍。
DEFAULT_BUFF_SIZE=4K 8K 16K 32K 128K 256K 512K 1M 2M
都试了,似乎没有什么进展
请教一下,怎么才能让复制速度提高呢?不说能比WIndows快,至少一样也可以啊。
谢谢了~!
代码:
bool __fastcall TClient::CopyFiles(String FileInfo)
{//复制文件并自动创建不存在的目录
String FromFile;
//源文件位置
String ToFile;
//目标文件位置
String tmp1,tmp2,tmp;
unsigned long int FromFileSize;
//源文件大小
unsigned long int ToFileSize;
//目标文件大小
HANDLE hFromFile;
//源文件句柄
HANDLE hToFile;
//目标文件句柄
FILETIME *FileTime;
FileTime=new FILETIME;
char *buff=new char[DEFAULT_BUFFER_SIZE];
//文件缓冲区
DWORD ReadSize=0;
//实际读入的字节
DWORD WriteSize=0;
//实际写入的字节
DWORD LastSize=0;
//剩余的字节
DWORD BuffSize=0;
//要读取的字节
bool IsFalse=false;
//是否复制失败,为真表示有失败

FromFile=LeftStr("|",FileInfo);
//源文件
FileInfo=SubStr("|",FileInfo);
ToFile=LeftStr("|",FileInfo);
//目标文件
FileInfo=SubStr("|",FileInfo);
FileInfo=SubStr("|",FileInfo);
FromFileSize=StrToInt(LeftStr("|",FileInfo));
//源文件大小
if(FromFile.IsEmpty() || ToFile.IsEmpty())
{
delete FileTime;
return false;
//如果为空就返回失败
}
//在这里加入复制文件和创建目录的代码
//--打开源文件
hFromFile=CreateFile(FromFile.c_str(),GENERIC_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(hFromFile==INVALID_HANDLE_VALUE) //如果无法打开则调用失败
{
delete FileTime;
return false;
}
//创建目标文件
if(FileExists(ToFile))
{//如果文件存在
if(DeleteFile(ToFile)==false)
{ //删除失败
if(FileSetAttr(ToFile,0)!=0)
{//设置属性失败就返回
CloseHandle(hFromFile);
delete FileTime;
return false;
}
if(DeleteFile(ToFile)==false)
{
CloseHandle(hFromFile);
delete FileTime;
return false;
}
}
hToFile=CreateFile(ToFile.c_str(),GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(hToFile==INVALID_HANDLE_VALUE)
{//仍然失败就返回
delete FileTime;
return false;
}
}
else
{//不存在
hToFile=CreateFile(ToFile.c_str(),GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(hToFile==INVALID_HANDLE_VALUE)
{//创建失败就建立目录
tmp=ToFile;
tmp1=LeftStr("//",tmp);
tmp=SubStr("//",tmp);
while(1)
{
if(tmp.Pos("//")==0) break;
tmp2=LeftStr("//",tmp);
tmp=SubStr("//",tmp);
tmp1+="//"+tmp2;
CreateDir(tmp1);
//建立目录
}
//建立完毕就再建立文件
hToFile=CreateFile(ToFile.c_str(),GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(hToFile==INVALID_HANDLE_VALUE)
{//仍然失败就返回
delete FileTime;
return false;
}
}
}
GetFileTime(hFromFile,NULL,NULL,FileTime);
//取得源文件的文件修改时间
//开始复制文件
LastSize=FromFileSize;
while(1) //开始复制
{
if(IsCancel)
{
IsFalse=true;
break;
}
LastSize-=ReadSize;
if(LastSize<=0)
{//如果复制完毕则关闭
break;

}
if(LastSize<=DEFAULT_BUFFER_SIZE)
{
BuffSize=LastSize;
}
else
{
BuffSize=DEFAULT_BUFFER_SIZE;
}
if(ReadFile(hFromFile,buff,BuffSize,&ReadSize,NULL)==false)
{ //如果读数据失败就返回
IsFalse=true;
break;
}
if(WriteFile(hToFile,buff,ReadSize,&WriteSize,NULL)==false)
{ //写数据失败就返回
IsFalse=true;
break;
}
do
neSize+=WriteSize;
//累计成功写入的数据量
}
SetFileTime(hToFile,NULL,NULL,FileTime);
//设置复制后的文件的修改日期
CloseHandle(hFromFile);
CloseHandle(hToFile);
delete FileTime;
delete []buff;
if(IsFalse)
{
return false;
}
else
{
return true;
}
}
大家帮我看看有哪儿需要优化的?
 
用 BlockRead, BlockWrite 会快些,或直接用 SHFileOperation。
 
我用的是BCB,似乎没有这2个函数呀~
 
那都需要优化。
你肯定是学vc的出身,复制文件一个函数搞定,你非用那么多语句。即使加上目录与判断,
也不过十几条语句。
按理说你的语句也不是特别多,但加上你调用的函数,时间片都被他们占用了。不慢才怪。
应该尽量用bcb的函数。
 
文件太大的话,直接用内核对象吧!这样更快,内存文件映像。
 
直接调用fopen、fread、fwrite和fclose可能会快吧
或者直接调用CopyFile
 
用CopyFile就很好啊!
 
后退
顶部