VC 同时多个指定类型,然后遍历文件夹

时间:2022-06-05 12:26:50
    RT。递归遍历指定文件夹的所有文件我会。
    可是,如果只遍历其中的某些个文件,那应该怎么做呢。
    例如:我只要查找到DOC TXT HTML这三个文件后缀的,那应该怎么办呢。虽然说能够通过比较的方法找得出(即查找所有后再根据后缀来比较),但是这样子的效率与遍历全部的一样了,有什么好方法.
    还有个小问题请高手指教一下,比如要在遍历某个文件夹(里面有多个文件夹及文件)下的txt文档,该怎么办呢。查找*.*可以递归遍历指定文件夹下的所有文件及文件夹,但我改成*.txt,就只能查找指定文件夹下的txt了

11 个解决方案

#1


例如:我只要查找到DOC TXT HTML这三个文件后缀的,那应该怎么办呢。虽然说能够通过比较的方法找得出(即查找所有后再根据后缀来比较),但是这样子的效率与遍历全部的一样了,有什么好方法.
=============
你分别对TXT,DOC,HTML遍历一次就行了。

#2


要查找多种文件可以是"*.txt;*.cpp;*.h;*.inl"过滤器。
以MFC为例:
CFileFind finder;
if (finder.FindFile(_T("*.txt;*.cpp;*.h;*.inl")))
{
while (finder.FindNextFile())
{
if (finder.IsDot())
..
if (finder.IsDirectory())
...
}
必要时可以第归。

#3


sorry!搞错!

#4


引用 1 楼 wltg2001 的回复:
例如:我只要查找到DOC TXT HTML这三个文件后缀的,那应该怎么办呢。虽然说能够通过比较的方法找得出(即查找所有后再根据后缀来比较),但是这样子的效率与遍历全部的一样了,有什么好方法.
=============
你分别对TXT,DOC,HTML遍历一次就行了。


只对TXT进行遍历,应该怎么写呢,在递归函数里面查找*.* ,能够遍历指定文件夹是里面的所有文件及子文件夹,改成*.txt,就只能查找指定文件夹下的txt了,子文件夹不进入。

#5


void found(CString lpPath)
{
CFileFind finder;
CString strWildcard(lpPath);
strWildcard += L"\\*.*";//只有查找*.*的时候才能遍历到子文件夹呀,我改成*.txt,就只能查找到指定目录里面的TXT,不会去查找子文件夹的。这怎么办?哪位高手指点一下如何遍历指定类型的呢?
BOOL bWorking = finder.FindFile(strWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
continue;
if (finder.IsDirectory())
{
found(finder.GetFilePath());
}
else
{
//我知道这里可以加了个判断:如果是txt(甚至判断是否DOC,HTML等),是就保存到数据中。但是这样子就与遍历*.*没区别了,我想要的是更有效率的方法,不知道有没有这种方法呢??哪位高手指点一下
FileName[i++] = finder.GetFilePath();
}
}
finder.Close();
}

#6


CFileFind find;

if (find.FindFile("D:\\*.*"))
{
//TRACE("%s",find.GetFileName());
if (find.FindNextFile() == 0 )
{
return ;
}

while(find.FindNextFile())
{
if (find.IsDots())
{
find.FindFile("D:\\*.txt"); //用时改成变量
TRACE("%s\n",find.GetFileName());
}
else if (find.IsDirectory())
{
find.GetFilePath();
TRACE("%s\n",find.GetFilePath());
//得到路径 查找路径底下的*.*然后递归慢慢找吧
}

}

希望对你有用

#7


悲剧了 如果根目录下有一个文件的话你自己在if (find.FindNextFile() == 0 )里处理一下
我忘记写了

#8


把那个该死的return去掉 纯属手误 敲上去了

#9


引用 6 楼 kkmqj 的回复:
if (find.IsDots())
{
  find.FindFile("D:\\*.txt"); //用时改成变量
   TRACE("%s\n",find.GetFileName());
}
else if (find.IsDirectory())
{
   find.GetFilePath();
   TRACE("%s\n",find.GetFilePath());
   //得到路径 查找路径底下的*.*然后递归慢慢找吧
}

find.IsDots() 应该continue。
find.IsDirectory() 就要进入此子文件夹进行查找。
这几行看不明白,我改了之后还是没什么作用呢好像,能否贴个完整的代码过来啊。


#10


CFileFind find;

if (find.FindFile("D:\\*.*"))
{
while(find.FindNextFile())
{
if (find.IsDirectory())
{
find.GetFilePath();
TRACE("%s\n",find.GetFilePath());
CString strTemp = find.GetFilePath() ;
strTemp += L"\\";
//得到路径
}
 if (!find.IsDots() && !find.IsDirectory())
{
CFileFind findchild;
findchild.FindFile("D:\\*.txt");
while (findchild.FindNextFile())
{
TRACE("%s\n",find.GetFileName());
}
findchild.Close();
}
}
}

find.Close();

 这是修改版本的。
得到D下的所有文件夹和*.txt
然后逐个文件夹找就可以了。
上边写的有问题。

#11


引用 10 楼 kkmqj 的回复:
C/C++ code
CFileFind find;
    
    if (find.FindFile("D:\\*.*"))
    {
            while(find.FindNextFile())
            {
                if (find.IsDirectory())
                {
        ……


事实上这个的效率更差,因为每找到一个文件,就会查找一次所有的*.txt。不过只有你最热心了,为了多谢你,把分给你了

#1


例如:我只要查找到DOC TXT HTML这三个文件后缀的,那应该怎么办呢。虽然说能够通过比较的方法找得出(即查找所有后再根据后缀来比较),但是这样子的效率与遍历全部的一样了,有什么好方法.
=============
你分别对TXT,DOC,HTML遍历一次就行了。

#2


要查找多种文件可以是"*.txt;*.cpp;*.h;*.inl"过滤器。
以MFC为例:
CFileFind finder;
if (finder.FindFile(_T("*.txt;*.cpp;*.h;*.inl")))
{
while (finder.FindNextFile())
{
if (finder.IsDot())
..
if (finder.IsDirectory())
...
}
必要时可以第归。

#3


sorry!搞错!

#4


引用 1 楼 wltg2001 的回复:
例如:我只要查找到DOC TXT HTML这三个文件后缀的,那应该怎么办呢。虽然说能够通过比较的方法找得出(即查找所有后再根据后缀来比较),但是这样子的效率与遍历全部的一样了,有什么好方法.
=============
你分别对TXT,DOC,HTML遍历一次就行了。


只对TXT进行遍历,应该怎么写呢,在递归函数里面查找*.* ,能够遍历指定文件夹是里面的所有文件及子文件夹,改成*.txt,就只能查找指定文件夹下的txt了,子文件夹不进入。

#5


void found(CString lpPath)
{
CFileFind finder;
CString strWildcard(lpPath);
strWildcard += L"\\*.*";//只有查找*.*的时候才能遍历到子文件夹呀,我改成*.txt,就只能查找到指定目录里面的TXT,不会去查找子文件夹的。这怎么办?哪位高手指点一下如何遍历指定类型的呢?
BOOL bWorking = finder.FindFile(strWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
if (finder.IsDots())
continue;
if (finder.IsDirectory())
{
found(finder.GetFilePath());
}
else
{
//我知道这里可以加了个判断:如果是txt(甚至判断是否DOC,HTML等),是就保存到数据中。但是这样子就与遍历*.*没区别了,我想要的是更有效率的方法,不知道有没有这种方法呢??哪位高手指点一下
FileName[i++] = finder.GetFilePath();
}
}
finder.Close();
}

#6


CFileFind find;

if (find.FindFile("D:\\*.*"))
{
//TRACE("%s",find.GetFileName());
if (find.FindNextFile() == 0 )
{
return ;
}

while(find.FindNextFile())
{
if (find.IsDots())
{
find.FindFile("D:\\*.txt"); //用时改成变量
TRACE("%s\n",find.GetFileName());
}
else if (find.IsDirectory())
{
find.GetFilePath();
TRACE("%s\n",find.GetFilePath());
//得到路径 查找路径底下的*.*然后递归慢慢找吧
}

}

希望对你有用

#7


悲剧了 如果根目录下有一个文件的话你自己在if (find.FindNextFile() == 0 )里处理一下
我忘记写了

#8


把那个该死的return去掉 纯属手误 敲上去了

#9


引用 6 楼 kkmqj 的回复:
if (find.IsDots())
{
  find.FindFile("D:\\*.txt"); //用时改成变量
   TRACE("%s\n",find.GetFileName());
}
else if (find.IsDirectory())
{
   find.GetFilePath();
   TRACE("%s\n",find.GetFilePath());
   //得到路径 查找路径底下的*.*然后递归慢慢找吧
}

find.IsDots() 应该continue。
find.IsDirectory() 就要进入此子文件夹进行查找。
这几行看不明白,我改了之后还是没什么作用呢好像,能否贴个完整的代码过来啊。


#10


CFileFind find;

if (find.FindFile("D:\\*.*"))
{
while(find.FindNextFile())
{
if (find.IsDirectory())
{
find.GetFilePath();
TRACE("%s\n",find.GetFilePath());
CString strTemp = find.GetFilePath() ;
strTemp += L"\\";
//得到路径
}
 if (!find.IsDots() && !find.IsDirectory())
{
CFileFind findchild;
findchild.FindFile("D:\\*.txt");
while (findchild.FindNextFile())
{
TRACE("%s\n",find.GetFileName());
}
findchild.Close();
}
}
}

find.Close();

 这是修改版本的。
得到D下的所有文件夹和*.txt
然后逐个文件夹找就可以了。
上边写的有问题。

#11


引用 10 楼 kkmqj 的回复:
C/C++ code
CFileFind find;
    
    if (find.FindFile("D:\\*.*"))
    {
            while(find.FindNextFile())
            {
                if (find.IsDirectory())
                {
        ……


事实上这个的效率更差,因为每找到一个文件,就会查找一次所有的*.txt。不过只有你最热心了,为了多谢你,把分给你了