在线求救,关于文件复制方面的问题

gwenxia 2003-12-05 12:29:47
我要做一个文件复制的程序(功能和windows的复制一样),请问各位高手我如何才能获得当前复制的进度(即完成了百分之多少,还有文件复制的速度是怎么获得的)?
...全文
114 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
EricTangHL 2003-12-19
  • 打赏
  • 举报
回复
mark
gwenxia 2003-12-17
  • 打赏
  • 举报
回复
好的,我的EMail是xiayingwen@hunau.net,谢了!
显刚 2003-12-15
  • 打赏
  • 举报
回复
我认为要精确显示进度必须遍历两遍源路径的内容
第一遍得到整个目录的大小
第二遍是将文件读取并在新目录下生成副本
应该有3个函数
GetFolderCount(const char* SourcePath)
CopyFile(const char* Source,const char* Dest)
CopyDir(const char* Source,const char* Dest)
可能还会有
CreateDir(const char* Path);
这些函数我都实现了效率比Windows的慢30%
你有兴趣,可以留个Mail探讨一下
gwenxia 2003-12-12
  • 打赏
  • 举报
回复
问题2
void CCopyingDlg::CopyingOperate(CString m_strSourFile,CString m_strDestFile)
{
char letter[2];
CFile SourceFile(m_strSourFile,CFile::modeReadWrite);
CFile DestFile(m_strDestFile,CFile::modeCreate|CFile::modeReadWrite);
CurrentLength=0;
TotalLength=SourceFile.GetLength();
/*m_ctrlAnimate.Open(strAnimateFile);
m_ctrlProgress.SetRange(CurrentLength,TotalLength);
m_ctrlProgress.SetStep(1);*/
while(CurrentLength<TotalLength)
{
SourceFile.Read(letter,1);
letter[1]='\0';
DestFile.Write(letter,1);
SourceFile.Seek(0,CFile::current);
DestFile.Seek(0,CFile::current);
CurrentLength++;
//m_ctrlProgress.StepIt();
//m_ctrlAnimate.Play(0,0xFFFF,1);
// m_iFinishPercent=CurrentLength*100/TotalLength;
// m_strFinishPercent.Format("%d%%",m_iFinishPercent);
// UpdateData(false);
}
AfxMessageBox("文件复制成功!");
m_ctrlAnimate.Stop();
SourceFile.Close();
DestFile.Close();
//CDialog::OnCancel();
}
调用语句为: DLG.DoModal(); //(选择好源文件和目标文件后就会出现另一个界面,动画和复制进度)
DLG.CopyingOperate(m_strSourFile,m_strDestFile);

为什么我无去掉注释语句,编译时照样没有出错,运行不但不会出现动画和文件复制的进度而且时还会出现(我是在另一个类时里面调用这个函数的)一大批的调试错误,程序被终止,请问高手们应该如何解决这个问题?若分数不够的话,我还可以加的!
gwenxia 2003-12-11
  • 打赏
  • 举报
回复
不能利用函数实现,必须是自己用程序实现,即利用文件的读写功能!
gwenxia 2003-12-11
  • 打赏
  • 举报
回复
难道就用fgetc()和fputc()吗
checkyvc6 2003-12-10
  • 打赏
  • 举报
回复
下面的想法很好啊,学习.....
CopyFileEx 的第三个参数:LPPROGRESS_ROUTINE 是个回调函数,其声明如下:


DWORD CALLBACK CopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // file size
LARGE_INTEGER TotalBytesTransferred, // bytes transferred
LARGE_INTEGER StreamSize, // bytes in stream
LARGE_INTEGER StreamBytesTransferred, // bytes transferred for stream
DWORD dwStreamNumber, // current stream
DWORD dwCallbackReason, // callback reason
HANDLE hSourceFile, // handle to source file
HANDLE hDestinationFile, // handle to destination file
LPVOID lpData // from CopyFileEx
);

TotalFileSize和TotalBytesTransferred一比较,进度不出来了?
一条晚起的虫 2003-12-10
  • 打赏
  • 举报
回复
API 函数,不用包含头文件,库文件是kernel32.lib
gwenxia 2003-12-09
  • 打赏
  • 举报
回复
这个函数的头文件是什么?
gwenxia 2003-12-09
  • 打赏
  • 举报
回复
我用这个函数时,怎么会出现这个函数没有定义,E:\114\xyw\VC\copy\CopyDlg.cpp(222) : error C2065: 'CopyFileEx' : undeclared identifier
maoxianwang 2003-12-08
  • 打赏
  • 举报
回复
嗯,用它采样就成~
gwenxia 2003-12-08
  • 打赏
  • 举报
回复
兄弟,可以举一个具体点的例子吗?
matiao 2003-12-07
  • 打赏
  • 举报
回复
CopyFileEx 的第三个参数:LPPROGRESS_ROUTINE 是个回调函数,其声明如下:

DWORD CALLBACK CopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // file size
LARGE_INTEGER TotalBytesTransferred, // bytes transferred
LARGE_INTEGER StreamSize, // bytes in stream
LARGE_INTEGER StreamBytesTransferred, // bytes transferred for stream
DWORD dwStreamNumber, // current stream
DWORD dwCallbackReason, // callback reason
HANDLE hSourceFile, // handle to source file
HANDLE hDestinationFile, // handle to destination file
LPVOID lpData // from CopyFileEx
);

TotalFileSize和TotalBytesTransferred一比较,进度不出来了?
gwenxia 2003-12-06
  • 打赏
  • 举报
回复
但是我要把复制的进度显示出来的,应该怎样才能取出这些数据?
jerryok638 2003-12-06
  • 打赏
  • 举报
回复
你可以打开一个文件,做一个读和写的循环。。
在这个循环中,你可以将文件依次地读到一个缓冲区中,再依次地写到目标文件中。
你在循环中对读的次数计数,这个次数乘上缓冲区的长度再除以文件的总长度就得到了当前进度。
输入文件的长度可以调用API函数得到。
oknight 2003-12-05
  • 打赏
  • 举报
回复
直接用文件的读写功能,自己当然知道读了多少,写了多少了
matiao 2003-12-05
  • 打赏
  • 举报
回复
用CopyFileEx 试一下。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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