未有人能解决的问题……! 小弟在各大论坛询问 未有点解难道这个问题很难?什么问题呢?这个问题是:“在网络传输文件时或者我们复制文件时那个进度条怎么弄?怎么实现他的百分比!”望各位能指教…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你先把那个进度条的控件拖到你的application里,然后在合适的地方进行初始化(对话框是initi..不太记得了,view就是oncreate好了),然后你写个消息函数,classwizard就可以帮你,然后你在那个地方写上你的触发要求(就是让进度条动的要求)这样每次达到一个百分比就触发一次事件,让进度条改变,你可以参考vc技术内幕第4版 下面是我写的遍历目录的代码段,里面里面用到了一些自定义的类,不过幸好当时代码的注释写的比较全,大体的结构思路应当还是能看出来的。///////////////////////////////////////////////////////////////////// IterateFolder()// 遍历一个文件夹.// 参数:// strPath: 文件夹路径// ProgFunc: 遍历过程中,每遍历10个文件,这个函数被调用一次// 可用于界面更新等在计算忙时的交互处理// 函数原型: void ProgFunc(int nFile, int nFolder)// 参数: nFile - 当前遍历文件数// nFolder - 当前遍历文件夹数void CFolderStruct::IterateFolder(const CString& strPath, CFolderStruct::PROGFUNC ProgFunc){ int iTempIndex; int nTempNChild; m_nFileNumber = 0; m_nFolderNumber = 0; CString strFind = strPath; strFind.TrimRight('\\'); CFileFind ff; if(ff.FindFile(strFind)) { ff.FindNextFile(); CFolderInfo* pFolderI = new CFolderInfo(ff); IterateFolder(pFolderI, 0, iTempIndex, nTempNChild, ProgFunc); }}///////////////////////////////////////////////////////////////////// IterateFolder()// 遍历一个文件夹.// 参数:// strPath: 文件夹路径// rCurFolderI: 当前文件夹信息// iParent: 父文件夹下标// iCurrent: 返回当前文件夹下标// nChild: 返回文件夹中的子文件夹总数// ProgFunc: 同上//// 返回值:// 返回被遍历文件夹及其所有子文件夹中文件的总大小////ULONG CFolderStruct::IterateFolder( CFolderInfo* pCurFolderI, int iParent, int& iCurrent, int& nChild, CFolderStruct::PROGFUNC ProgFunc){ // 生成一个文件夹结构节点,并加入到列表中 CFolderFileInfo* pFFI = new CFolderFileInfo; CFolderStructNode* pNode = new CFolderStructNode(pCurFolderI, pFFI, iParent); iCurrent = m_arrFolders.Add(pNode); // 返回参数 - 这个目录在列表中的位置 ULONG ulFullSize = 0; // pCurFolderI的总大小(包括子目录中的文件) ULONG ulLocalSize = 0; // pCurFolderI的大小(不包括子目录中的文件) int nFileNumber = 0; // pCurFolderI的文件数(包括子目录中的文件) int nFolderNumber = 0; // pCurFolderI的文件夹数(包括子目录中的文件) CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串 strFind.TrimRight('\\'); strFind += "\\*.*"; CFileFind ff; BOOL bMore = ff.FindFile(strFind); while(bMore) { bMore = ff.FindNextFile(); // 找到的是 . 或 .. if(ff.IsDots()) continue; if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. ) { CFolderInfo* pFolderI = new CFolderInfo(ff); // 找到的文件夹的信息 int iSubIndex; // pFolder的下标 int nNestedChild; // pFolder的子文件夹总数(包括子目录中的) // 遍历这个文件夹,并得到它的下标及其子目录下标 // 函数返回该文件夹的总大小 ulFullSize += IterateFolder(pFolderI, iCurrent, iSubIndex, nNestedChild, ProgFunc); pNode->AddChild(iSubIndex); // 添加子目录下标 m_nFolderNumber += 1; // 从根目录算起的文件夹总数 nFolderNumber += (1 + nNestedChild); // 当前目录的文件夹总数 nFileNumber += pFolderI->GetFileNumber(); // 当前目录的文件总数 } else // find a file { CFileInfo* pFileI = new CFileInfo(ff); // 找到的文件的信息 pFFI->Add(pFileI); // 加入到文件信息列表中 ulLocalSize += pFileI->GetSize(); ++m_nFileNumber; // 从根目录算起的文件总数 ++nFileNumber; // 当前目录的文件总数 if((m_nFileNumber%10) == 0 && ProgFunc) // 其它处理 ProgFunc(m_nFileNumber, m_nFolderNumber); } } ulFullSize += ulLocalSize; pCurFolderI->SetFileNumber(nFileNumber); pCurFolderI->SetFolderNumber(nFolderNumber); pCurFolderI->SetLocalSize(ulLocalSize); pCurFolderI->SetFullSize(ulFullSize); nChild = nFolderNumber; // 返回参数 - 这个目录中的文件夹总数 return ulFullSize;} 大体结构如下:ULONG CFolderStruct::IterateFolder( CFolderInfo* pCurFolderI, int iParent, int& iCurrent, int& nChild, CFolderStruct::PROGFUNC ProgFunc){ // 统计变量声明... // 生成当前目录路径 CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串 strFind.TrimRight('\\'); strFind += "\\*.*"; // 开始查找 CFileFind ff; BOOL bMore = ff.FindFile(strFind); while(bMore) { bMore = ff.FindNextFile(); if(ff.IsDots()) // 找到的是 . 或 .. continue; if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. ) { // 递归调用IterateFolder() // 遍历这个文件夹,并得到它的下标及其子目录下标 // 函数返回该文件夹的总大小 ulFullSize += IterateFolder(new FolerInfo(ff),...); // 进行目录信息统计... } else // 找到一个文件 { // 进行文件信息统计... } } // 其它统计... return ulFullSize; // 返回目录下文件总大小} 大体结构如下:ULONG CFolderStruct::IterateFolder( CFolderInfo* pCurFolderI, int iParent, int& iCurrent, int& nChild, CFolderStruct::PROGFUNC ProgFunc){ // 统计变量声明... // 生成当前目录路径 CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串 strFind.TrimRight('\\'); strFind += "\\*.*"; // 开始查找 CFileFind ff; BOOL bMore = ff.FindFile(strFind); while(bMore) { bMore = ff.FindNextFile(); if(ff.IsDots()) // 找到的是 . 或 .. continue; if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. ) { // 递归调用IterateFolder() // 遍历这个文件夹,并得到它的下标及其子目录下标 // 函数返回该文件夹的总大小 ulFullSize += IterateFolder(new FolerInfo(ff),...); // 进行目录信息统计... } else // 找到一个文件 { // 进行文件信息统计... } } // 其它统计... return ulFullSize; // 返回目录下文件总大小} 大体结构如下:ULONG CFolderStruct::IterateFolder( CFolderInfo* pCurFolderI, int iParent, int& iCurrent, int& nChild, CFolderStruct::PROGFUNC ProgFunc){ // 统计变量声明... // 生成当前目录路径 CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串 strFind.TrimRight('\\'); strFind += "\\*.*"; // 开始查找 CFileFind ff; BOOL bMore = ff.FindFile(strFind); while(bMore) { bMore = ff.FindNextFile(); if(ff.IsDots()) // 找到的是 . 或 .. continue; if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. ) { // 递归调用IterateFolder() // 遍历这个文件夹,并得到它的下标及其子目录下标 // 函数返回该文件夹的总大小 ulFullSize += IterateFolder(new FolerInfo(ff),...); // 进行目录信息统计... } else // 找到一个文件 { // 进行文件信息统计... } } // 其它统计... return ulFullSize; // 返回目录下文件总大小} 如果是单个文件就简单得不用说了。多个文件就如 BalonFan(风飘影) 说的一样用递归统计文件总大小,然后用已传送字节数比上总大小就得到百分比了。 急!!主对话框和弹出对话框同时刷新问题 vfw帧回调函数的数据问题 使用IOCP需要介面吗? 谁知道MMC中的那个远程获取硬件信息怎么实现的? B进程怎么样接收A进程发来的消息啊?(有源码,帮看下,谢谢) 请问怎样获得当前鼠标下超连接的信息? 我是一个30岁的人,也没有太多的编程经验,仅仅曾编过一些FOXPRO的程序。不知我现在立志做编程是否还来得及?请业内人士指点,多谢! 各位大侠帮忙看下我的这个问题,谢谢! 高手请指教 关于MFC的大量问题答辩? 关于CIPAddressCtrl控件的使用问题? 新年的钟声将要敲响,个人以csdn全体版主的名义,祝大家新年快乐,并散分一表心意
(对话框是initi..不太记得了,view就是oncreate好了),然后你写个消息函数,classwizard就可以帮你,然后你在那个地方写上你的触发要求(就是让进度条动的要求)这样每次达到一个百分比就触发一次事件,让进度条改变,你可以参考vc技术内幕第4版
//
// IterateFolder()
// 遍历一个文件夹.
// 参数:
// strPath: 文件夹路径
// ProgFunc: 遍历过程中,每遍历10个文件,这个函数被调用一次
// 可用于界面更新等在计算忙时的交互处理
// 函数原型: void ProgFunc(int nFile, int nFolder)
// 参数: nFile - 当前遍历文件数
// nFolder - 当前遍历文件夹数void CFolderStruct::IterateFolder(const CString& strPath, CFolderStruct::PROGFUNC ProgFunc)
{
int iTempIndex;
int nTempNChild; m_nFileNumber = 0;
m_nFolderNumber = 0; CString strFind = strPath;
strFind.TrimRight('\\');
CFileFind ff;
if(ff.FindFile(strFind))
{
ff.FindNextFile();
CFolderInfo* pFolderI = new CFolderInfo(ff);
IterateFolder(pFolderI, 0, iTempIndex, nTempNChild, ProgFunc);
}
}
/////////////////////////////////////////////////////////////////
//
// IterateFolder()
// 遍历一个文件夹.
// 参数:
// strPath: 文件夹路径
// rCurFolderI: 当前文件夹信息
// iParent: 父文件夹下标
// iCurrent: 返回当前文件夹下标
// nChild: 返回文件夹中的子文件夹总数
// ProgFunc: 同上
//
// 返回值:
// 返回被遍历文件夹及其所有子文件夹中文件的总大小
//
//ULONG CFolderStruct::IterateFolder( CFolderInfo* pCurFolderI,
int iParent,
int& iCurrent,
int& nChild,
CFolderStruct::PROGFUNC ProgFunc)
{
// 生成一个文件夹结构节点,并加入到列表中
CFolderFileInfo* pFFI = new CFolderFileInfo;
CFolderStructNode* pNode = new CFolderStructNode(pCurFolderI, pFFI, iParent);
iCurrent = m_arrFolders.Add(pNode); // 返回参数 - 这个目录在列表中的位置 ULONG ulFullSize = 0; // pCurFolderI的总大小(包括子目录中的文件)
ULONG ulLocalSize = 0; // pCurFolderI的大小(不包括子目录中的文件)
int nFileNumber = 0; // pCurFolderI的文件数(包括子目录中的文件)
int nFolderNumber = 0; // pCurFolderI的文件夹数(包括子目录中的文件) CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串
strFind.TrimRight('\\');
strFind += "\\*.*"; CFileFind ff;
BOOL bMore = ff.FindFile(strFind); while(bMore)
{
bMore = ff.FindNextFile(); // 找到的是 . 或 ..
if(ff.IsDots())
continue;
if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. )
{
CFolderInfo* pFolderI = new CFolderInfo(ff); // 找到的文件夹的信息
int iSubIndex; // pFolder的下标
int nNestedChild; // pFolder的子文件夹总数(包括子目录中的) // 遍历这个文件夹,并得到它的下标及其子目录下标
// 函数返回该文件夹的总大小
ulFullSize += IterateFolder(pFolderI, iCurrent, iSubIndex,
nNestedChild, ProgFunc); pNode->AddChild(iSubIndex); // 添加子目录下标 m_nFolderNumber += 1; // 从根目录算起的文件夹总数
nFolderNumber += (1 + nNestedChild); // 当前目录的文件夹总数
nFileNumber += pFolderI->GetFileNumber(); // 当前目录的文件总数
}
else // find a file
{
CFileInfo* pFileI = new CFileInfo(ff); // 找到的文件的信息
pFFI->Add(pFileI); // 加入到文件信息列表中
ulLocalSize += pFileI->GetSize();
++m_nFileNumber; // 从根目录算起的文件总数
++nFileNumber; // 当前目录的文件总数 if((m_nFileNumber%10) == 0 && ProgFunc) // 其它处理
ProgFunc(m_nFileNumber, m_nFolderNumber);
}
} ulFullSize += ulLocalSize; pCurFolderI->SetFileNumber(nFileNumber);
pCurFolderI->SetFolderNumber(nFolderNumber);
pCurFolderI->SetLocalSize(ulLocalSize);
pCurFolderI->SetFullSize(ulFullSize); nChild = nFolderNumber; // 返回参数 - 这个目录中的文件夹总数 return ulFullSize;
}
int iParent,
int& iCurrent,
int& nChild,
CFolderStruct::PROGFUNC ProgFunc)
{
// 统计变量声明... // 生成当前目录路径
CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串
strFind.TrimRight('\\');
strFind += "\\*.*"; // 开始查找
CFileFind ff;
BOOL bMore = ff.FindFile(strFind); while(bMore)
{
bMore = ff.FindNextFile();
if(ff.IsDots()) // 找到的是 . 或 ..
continue; if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. )
{
// 递归调用IterateFolder()
// 遍历这个文件夹,并得到它的下标及其子目录下标
// 函数返回该文件夹的总大小
ulFullSize += IterateFolder(new FolerInfo(ff),...); // 进行目录信息统计...
}
else // 找到一个文件
{
// 进行文件信息统计...
}
} // 其它统计... return ulFullSize; // 返回目录下文件总大小
}
int iParent,
int& iCurrent,
int& nChild,
CFolderStruct::PROGFUNC ProgFunc)
{
// 统计变量声明... // 生成当前目录路径
CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串
strFind.TrimRight('\\');
strFind += "\\*.*"; // 开始查找
CFileFind ff;
BOOL bMore = ff.FindFile(strFind); while(bMore)
{
bMore = ff.FindNextFile();
if(ff.IsDots()) // 找到的是 . 或 ..
continue; if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. )
{
// 递归调用IterateFolder()
// 遍历这个文件夹,并得到它的下标及其子目录下标
// 函数返回该文件夹的总大小
ulFullSize += IterateFolder(new FolerInfo(ff),...); // 进行目录信息统计...
}
else // 找到一个文件
{
// 进行文件信息统计...
}
} // 其它统计... return ulFullSize; // 返回目录下文件总大小
}
int iParent,
int& iCurrent,
int& nChild,
CFolderStruct::PROGFUNC ProgFunc)
{
// 统计变量声明... // 生成当前目录路径
CString strFind = pCurFolderI->GetPath(); // 用于查找的字符串
strFind.TrimRight('\\');
strFind += "\\*.*"; // 开始查找
CFileFind ff;
BOOL bMore = ff.FindFile(strFind); while(bMore)
{
bMore = ff.FindNextFile();
if(ff.IsDots()) // 找到的是 . 或 ..
continue; if(ff.IsDirectory()) // 找到的是一个文件夹(不是 . 或 .. )
{
// 递归调用IterateFolder()
// 遍历这个文件夹,并得到它的下标及其子目录下标
// 函数返回该文件夹的总大小
ulFullSize += IterateFolder(new FolerInfo(ff),...); // 进行目录信息统计...
}
else // 找到一个文件
{
// 进行文件信息统计...
}
} // 其它统计... return ulFullSize; // 返回目录下文件总大小
}
多个文件就如 BalonFan(风飘影) 说的一样用递归统计文件总大小,然后用已传送字节数比上总大小就得到百分比了。