回顾:文件夹遍历技术是一种非常有用的技术,用于文件搜索和防病毒软件,我将讨论如何在win32下实现这一技术。
文件夹遍历技术的核心是递归算法。我对递归算法不太了解。我对朋友了解不多。请找出Tan先生的C编程。
下面是以下几点





文件夹遍历技术是一种非常有用的技术,在文件搜索和防病毒软件中都有使用,本文将讨论如何在win32下实现这一技术。

文件夹遍历技术的核心是递归算法。我对递归算法不太了解。我对朋友了解不多。请找出Tan先生的C编程。

下面是我的算法伪代码:





函数(LPCTSTR lpszpath)
{
开始查找;
如果(未找到文件)
返回;

{
如果(发现文件是一个目录)
函数(在目录中找到);
其他的
文件的操作;
}(查找下一个文件并成功);
}





实现此算法所需的API函数和结构如下:

FindFirstFile;
FindNextFile;
win32_find_data。


在这里,我假设您已经理解了上述函数和结构的用法,现在让我们开始。

现在我要写的代码开始查找。在那之前,我会先假设这个lpszpath功能参数介绍的路径是:X(根目录)或X:Dir(非根目录),因为路径格式通常用于Win32编程,你必须注意,如果路径根目录,在它后面的路径分隔符;;另一方面,它没有。所以当我写的代码,我要分别处理这两例。这段代码如下:



max_path TCHAR szfind { };
Lstrcpy(szfind,lpszpath);
如果(!IsRoot(szfind)) / /根基功能是我所写的,如果参数是根目录,返回true
Lstrcat(szfind,);
Lstrcat(szfind*。);查找所有文件
WIN32_FIND_DATA WFD;
处理hfind = FindFirstFile(szfind,WFD);
如果(invalid_handle_value = = hfind) / /如果未能找到或找不到
返回;




我要在这里讨论的是做什么,如果你找到一个文件。但在那之前,请进入MS-DOS模式,输入dir回到车上。你看到了什么



是的,DOS是不说谎,不像Windows已经躲起来,让你看到过重要的事情;mdash;如果你不是根目录,你会看到.. 两目录mdash;mdash;这是不是在资源管理中看到。这一切了通过DOS时代的朋友是很好的理解。一个点表示当前目录,和两个点代表第一类目录。所以当我面对的信息,我会过滤掉其中的原因,我解释下。的DO-WHILE部分代码如下:






{
如果(lstrcmp(wfd.cfilename,_t(,)| | lstrcmp(wfd.cfilename = = 0),_t(,))= = 0)
继续;过滤两个目录
如果(wfd.dwfileattributes file_attribute_directory)
{
max_path TCHAR szfile { };
如果(IsRoot(lpszpath))
Wsprintf(szfile,%s %s
其他的
Wsprintf(szfile,%s%s
功能(szfile); / /如果是一个目录,然后进入目录递归
}
其他的
{
操作文件
}
}而(FindNextFile(hfind,WFD));
FindClose(hfind / /关闭);查询处理





现在我将解释为什么这两个目录都被过滤了。正如你所看到的,如果你找到了一个目录,然后进入这个目录递归mdash;mdash;那么,如果当前目录答案是显而易见的。如果它不过滤它,程序将进入当前目录,递归,是的,如果它会导致递归继续进行。

这么多算法。因为这是一个非常昂贵的系统资源算法,所以当你在程序中使用它时,你应该把它放在一个线程中,否则它会导致你的程序在搜索过程中没有响应。

如果你有更好的算法,在下面我们讨论邀请。

附录:IsRoot功能的源代码




BOOL IsRoot(LPCTSTR lpszpath)
{
TCHAR szroot { 4 };
Wsprintf(szroot,% C:
返回(lstrcmp(szroot,lpszpath)= = 0);
}