`
evget
  • 浏览: 144742 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类

Win32的文件夹遍历方法之递归写法

阅读更多
文章关键字:|递归|Win32|文件夹|遍历|

  文件夹遍历技术是一种非常有用的技术,在文件的搜索以及杀毒软件中都使用了这种技术。以下我将讨论如何在Win32下实现这种技术。文件夹遍历技术的核心就是使用递归算法,关于递归算法我这里就不多介绍了,不明白的朋友请参阅相关内容。

以下是我的算法伪代码:
void function(LPCTSTR lpszPath)
{
开始查找;
if (没有找到文件)
return;
do
{
if (找到的文件是目录)
function(找到的目录);
else
对文件进行操作;
} while (查找下一个文件并成功);
}

  实现这个算法所需要用到的API函数以及结构体有:

FindFirstFile;
FindNextFile;
WIN32_FIND_DATA。
  在此我假定你已经明白了以上函数及结构体的用法,now let's begin。

  现在我来编写开始查找的代码。在这之前,我先假定函数参数lpszPath传入的路径格式为X:\(根目录)或X:\Dir(非根目录),因为Win32程序设计中通常使用的就是这种路径格式。你一定注意到了,如果路径是根目录,它的后边有一个路径分隔符“\”,反之则没有。那么我在写代码的时候必须对这两种情况分别处理。这段代码如下:

TCHAR szFind[MAX_PATH];
lstrcpy(szFind, lpszPath);
if (!IsRoot(szFind)) // IsRoot是我自己编写的函数,若参数是根目录,则返回true
lstrcat(szFind, "\\");
lstrcat(szFind, "*.*"); // 找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szFind, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return;

  下面我将讨论的是如果找到了文件,该怎么办。不过在此之前,请你进入MS-DOS方式,并输入dir回车,你看到了什么?

  是的,DOS是不会说假话的,不像Windows一样总把重要的东西隐藏起来不让你看到——如果你所在的不是根目录,你将会看到“.”与“..”这两个目录——这是在资源管理器中看不到的。从DOS时代走过的朋友们大抵都明白吧,一个点代表的是当前目录,两个点代表的是上一级目录。那么我在处理信息时,就一定得把它们两个过滤出去,原因我在下面解释。do-while段的代码如下:

do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
function(szFile); // 如果找到的是目录,则进入此目录进行递归
}
else
{
// 对文件进行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄

  现在我来解释为什么要把那两个带点的目录过滤出去。如你所见,如果找到的是目录,那么进入此目录进行递归——那么若是当前目录呢?答案很明显,如果不对其进行过滤,那么程序将进入“当前目录”进行递归。是的,如是将导致递归无休止地进行下去。

  算法就这么多了,由于这是一个极其耗费系统资源的算法,因此你在程序中用到它的时候,最好将其放到一个单独的线程中运行,否则将会导致你的程序在查找过程中没有任何响应。

附:IsRoot函数源码
BOOLIsRoot(LPCTSTR lpszPath)
{
TCHAR szRoot[4];
wsprintf(szRoot, "%c:\\", lpszPath[0]);
return (lstrcmp(szRoot, lpszPath) == 0);
}

原文地址:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9176
分享到:
评论

相关推荐

    C语言实现二叉树的前序遍历(非递归)

    在深入探讨C语言实现二叉树的前序遍历(非递归)之前,我们首先应当理解何为二叉树以及前序遍历的基本概念。 ### 二叉树简介 二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子...

    digui.rar_digui_文件夹遍历_递归_递归 c#_遍历文件

    总结来说,递归遍历文件夹是C#编程中一个基础但重要的技巧,通过递归方法,我们可以轻松地访问和操作文件系统中的任意深度的文件和文件夹。在开发过程中,理解和掌握递归遍历不仅可以提高代码的可读性和效率,还能...

    二叉树后序遍历的非递归算法

    这是数据结构中二叉树的后序遍历的非递归算法的源代码。

    中序遍历二叉树非递归算法

    通常,我们首先通过递归来实现二叉树的遍历,但递归方法可能因深度过大导致栈溢出,因此掌握非递归版本的遍历算法显得尤为重要。 ### 中序遍历二叉树非递归算法详解 #### 1. 理解中序遍历的基本概念 中序遍历是一...

    二叉树先序、中序、后序三种遍历的非递归算法

    下面我们将讨论这三种遍历方法的非递归算法。 一、先序遍历非递归算法 先序遍历是指先访问根结点,然后访问左子树,最后访问右子树。非递归算法使用栈来实现遍历。下面是先序遍历非递归算法的实现代码: ```c ...

    递归遍历与非递归遍历文件夹.pdf

    在遍历文件夹时,递归遍历会从根目录开始,对于每个子目录,它会再次调用自身来处理子目录,直到所有子目录都被访问。框图中的“Get_nodeRoot_path”可能表示获取根目录的路径,然后“Search directory”是开始递归...

    二叉树的遍历方法和递归实现

    ### 二叉树的遍历方法与递归实现详解 #### 一、二叉树的遍历概述 二叉树的遍历是计算机科学中一个基础而重要的概念,它涉及到了对二叉树结构的系统访问策略。遍历的目的在于确保二叉树中的每一个节点都能够被访问...

    二叉树遍历前序非递归算法

    C语言二叉树遍历前序非递归算法,简单易懂,正确无误

    先序遍历的非递归算法

    "先序遍历的非递归算法" 本文将详细介绍二叉树的先序遍历非递归算法,包括其原理、实现代码和相关知识点。 知识点1:二叉树的概念 二叉树是一种特殊的树形结构,每个节点最多有两个孩子节点:左孩子和右孩子。...

    二叉树先序遍历、中序遍历和后序遍历非递归算法 C++源码

    用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法

    中序遍历二叉树的递归算法

    本文将详细介绍如何使用递归方法实现二序遍历二叉树,并解释其背后的原理与应用场景。 #### 二叉树简介 二叉树是一种数据结构,其中每个节点最多有两个子节点:左子节点和右子节点。二叉树可以用来表示各种层次...

    二叉树后序遍历的非递归算法。

    二叉树后序遍历的非递归算法是指在遍历二叉树时,不使用递归函数,而是使用栈来存储结点的方法。该算法的主要思想是使用一个栈来存储结点,通过标志 flag 区分同一个结点的两次出栈。 在该算法中,首先将根指针 ...

    多级文件夹遍历,准确遍历多级文件夹下的内容

    文件夹遍历通常涉及编程语言中的文件I/O操作,尤其是遍历目录和子目录的函数或方法。例如,在Python中,我们可以使用`os`和`os.path`模块来实现这一功能。`os.walk()`函数是一个非常实用的工具,它会生成目录树中的...

    数据结构 二叉树三种遍历的非递归算法(背诵版).doc

    为了解决二叉树遍历的问题,通常有递归和非递归两种方法。尽管递归方法自然、直观,但在处理深度较大的二叉树时,可能会因为递归调用过多而导致栈溢出,这时非递归算法就显得尤为重要。本篇文章将深入探讨二叉树三种...

    二叉树递归遍历,非递归遍历,按层次遍历

    本篇文章将深入探讨二叉树的三种遍历方法:递归遍历(前序、中序、后序)、非递归遍历以及层次遍历。 1. **递归遍历**: - **前序遍历**:先访问根节点,然后递归地遍历左子树,最后遍历右子树。用公式表示为:根-...

    二叉树的递归遍历、非递归遍历和层次遍历

    二叉树的递归遍历、非递归遍历和层次遍历

    二叉树的遍历的非递归算法(C++模板实现)

    使用C++模板、类的技术实现了二叉树的中序遍历,在BC3.1已经测试成功

    C++ 二叉树的先序遍历、中序遍历和后序遍历非递归算法

    用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。

    二叉树的递归遍历,中序遍历,先序遍历,后序遍历

    二叉树的递归遍历 二叉树是一种重要的数据结构,它广泛应用于计算机科学和信息技术领域。二叉树的遍历是指从二叉树的根结点出发,访问树中每个结点的过程。二叉树的遍历有多种方式,本文将介绍二叉树的递归遍历,...

Global site tag (gtag.js) - Google Analytics