崩溃了~关于遍历硬盘下所有文件的问题

thisisll 2005-05-24 09:49:54
大家应该对下面遍历文件的函数很熟悉

void CSearchThread::LoopFiles(CString sPath)
{
CFileFind oFileFind;
BOOL bFile;
CString sDir = sPath;

if ( sDir.Right(1) != '\\' )
sDir += '\\';
sDir += "*.*";
bFile=oFileFind.FindFile( sDir );
while( bFile )
{
bFile=oFileFind.FindNextFile();
if( oFileFind.IsDirectory()&&!oFileFind.IsDots())//文件夹
{
CString sFilePath,sFileName;
sFilePath=oFileFind.GetFilePath();
LoopFiles( sFilePath );
}
if ( !oFileFind.IsDirectory() && !oFileFind.IsDots())//文件
{

……………………
}
}
}

给了sPath就可以遍历
如果sPath是这样c:\abc.exe
通过这段
if ( sDir.Right(1) != '\\' )
sDir += '\\';
sDir += "*.*";
sPath 应该成了c:\abc.exe\*.*

可是我跟这段的时候
他执行了那3行
可sPath还是c:\abc.exe

这个函数还是可以遍历路径下所有文件的

可是如果sPath是c:
那么他还是不加后面的\*.*
这样就没法遍历c盘下的文件了
奇怪的很

希望有经验的朋友们能给我指点指点

...全文
241 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
koko1998 2005-05-25
  • 打赏
  • 举报
回复
没什么问题啊.
如果你的参数传入的是"D:\\a.txt"的话,也不会有问题的啊,D:\\a.txt\\*.* 也是什么也找不到,不过会浪费点时间.
当然也也可以加些if判断

void CAboutDlg::LoopFiles(CString sPath)
{
CFileFind oFileFind;
BOOL bFile;
CString sDir = sPath;

if ( sDir.Right(1) != '\\' ) sDir += '\\';
sDir += "*.*";
bFile=oFileFind.FindFile( sDir );
while( bFile )
{
bFile=oFileFind.FindNextFile();
if( oFileFind.IsDirectory()&&!oFileFind.IsDots())//文件夹
{
CString sFilePath,sFileName;
sFilePath=oFileFind.GetFilePath();
LoopFiles( sFilePath );
}
if ( !oFileFind.IsDirectory() && !oFileFind.IsDots())//文件
{
;
}
}
}
vcmute 2005-05-25
  • 打赏
  • 举报
回复
测试没问题的,看看调用处代码
void LoopFiles(CString sPath)
{
CFile FindoFileFind;
BOOL bFile;
CString sDir = sPath;

if ( sDir.Right(1) != '\\' )
sDir += '\\';
sDir += "*.*";
}
StarsWu 2005-05-25
  • 打赏
  • 举报
回复
可以在程序开始用_access判断输入的是文件夹还是文件,然后分别处理。
thisisll 2005-05-24
  • 打赏
  • 举报
回复
哈哈!
终于发现了
原来是CString的问题
具体什么问题我还是没搞明白

我解决的方法是用LPCTSTR倒了一下
CString sTmp;
LPCTSTR strTmp;
strTmp=sDir;
sTmp=strTmp;
if(sTmp.Right(1)==":")
{
sTmp+="\\";
sDir=sTmp;
}
希望大家能继续讨论
能让我把这个CString的问题搞明白
thisisll 2005-05-24
  • 打赏
  • 举报
回复
是我没说清楚
我就要变sDir
xyw2278 2005-05-24
  • 打赏
  • 举报
回复
同志,sPath会变吗?
你变得是sDir!
luoxiangdong 2005-05-24
  • 打赏
  • 举报
回复
你的代码看起来似乎没有什么问题
thisisll 2005-05-24
  • 打赏
  • 举报
回复
就是sPath="C:\\abc.exe";这样的
martingod 2005-05-24
  • 打赏
  • 举报
回复
你的参数sPath是这样写的吗??

sPath="C:\\abc.exe";

可不能写成 sPath="C:\abc.exe";
thisisll 2005-05-24
  • 打赏
  • 举报
回复
我是想让大家帮我看看我的函数的问题
luoxiangdong 2005-05-24
  • 打赏
  • 举报
回复
我这里的int type是其他用途
luoxiangdong 2005-05-24
  • 打赏
  • 举报
回复

void ConvDir(int type,char *fname)
{
char searchstr[2048];
HANDLE handle;
WIN32_FIND_DATA fileinfo;

sprintf(searchstr,"%s\\*.*",fname);
handle=FindFirstFile(searchstr,&fileinfo);
while(INVALID_HANDLE_VALUE!=handle)
{
if((fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
if(strcmp(fileinfo.cFileName,".")!=0 && strcmp(fileinfo.cFileName,"..")!=0)
{
char fullpath[2048];
sprintf(fullpath,"%s\\%s",fname,fileinfo.cFileName);

ConvDir(type,fullpath);
}
}else
{

处理单个文件:
ConvOneFile(type,fname,fileinfo.cFileName);

}

if(!FindNextFile(handle,&fileinfo))
{
FindClose(handle);
handle=INVALID_HANDLE_VALUE;
};

}



}
thisisll 2005-05-24
  • 打赏
  • 举报
回复
if ( sDir.Right(1) != '\\' )
sDir += '\\';
sDir += "*.*";
是我试的时候改的
我看别的资料上
应该是
if ( sDir.Right(1) != "\\" )
sDir += "\\";
sDir += "*.*";

反正两种方法都不可以

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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