首页 > 编程语言 >【IO编程】深度优先遍历

【IO编程】深度优先遍历

时间:2025-01-13 16:58:11浏览次数:3  
标签:遍历 编程 test IO directory path os 目录

**深度优先遍历目录(Depth-First Traversal)**是一种递归或栈式的目录遍历方法,优先深入到子目录中,再回溯到父目录继续遍历其他子目录。这是一种常见的文件系统操作,适用于查找文件、统计目录大小等场景。

深度优先遍历完整思路
  1. 递归式遍历:优先进入子目录,完成当前目录所有子目录的遍历后再返回上一层。
  2. 适合处理嵌套结构:目录树是一个递归结构,深度优先遍历特别适用于这种嵌套结构。
  3. 有序性
    • 由上至下:先访问父目录,再依次深入子目录。
    • 从左至右:每层目录按照特定顺序(如字母顺序)排列。
代码详情具体实现深度优先遍历目录的过程(通过代码的编程思路直观的理解深度优先的编程思路)

在 C语言 中,可以使用 dirent.h 提供的函数(如 opendir()readdir())来遍历目录。同时可以使用递归来实现深度优先遍历。

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

// 深度优先遍历目录
void dfs_directory(const char *path, int depth) {
    DIR *dir = opendir(path);
    if (dir == NULL) {
        perror("opendir");
        return;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 跳过当前目录和父目录
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }

        // 构造完整路径
        char full_path[1024];
        snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name);

        // 判断是否为目录
        struct stat st;
        if (stat(full_path, &st) == 0 && S_ISDIR(st.st_mode)) {
            // 打印目录并递归进入
            printf("%*s[DIR] %s\n", depth * 2, "", full_path);
            dfs_directory(full_path, depth + 1);
        } else {
            // 打印文件
            printf("%*s[FILE] %s\n", depth * 2, "", entry->d_name);
        }
    }

    closedir(dir);
}

int main(int argc, char *argv[]) {
    const char *start_path = argc > 1 ? argv[1] : ".";
    dfs_directory(start_path, 0);
    return 0;
}

再使用 Python 实现,因为 python 轻量级语言,实现过程更为简洁:
Python 的标准库 os 和 os.path 提供了文件和目录操作的相关工具,可以轻松实现深度优先遍历目录。
代码逻辑(递归实现)

import os

def dfs_directory(path, depth=0):
    # 打印当前目录
    print("  " * depth + f"[DIR] {path}")

    # 遍历当前目录的所有文件和子目录
    for entry in os.listdir(path):
        full_path = os.path.join(path, entry)
        # 如果是目录,则递归遍历
        if os.path.isdir(full_path):
            dfs_directory(full_path, depth + 1)
        else:
            # 如果是文件,则打印文件路径
            print("  " * (depth + 1) + f"[FILE] {entry}")

# 调用函数
start_path = "./test_directory"  # 替换为需要遍历的目录
dfs_directory(start_path)

我们先假设目录结构如下:

test_directory/
├── file1.txt
├── subdir1/
│   ├── file2.txt
│   └── file3.txt
└── subdir2/
    └── subsubdir/
        └── file4.txt

输出:

[DIR] ./test_directory
  [FILE] file1.txt
  [DIR] ./test_directory/subdir1
    [FILE] file2.txt
    [FILE] file3.txt
  [DIR] ./test_directory/subdir2
    [DIR] ./test_directory/subdir2/subsubdir
      [FILE] file4.txt

另一种实现方式:栈实现(非递归)
深度优先遍历也可以通过栈来实现,避免递归调用的栈深度限制。

import os

def dfs_directory_stack(path):
    # 使用栈实现深度优先遍历
    stack = [path]

    while stack:
        current_path = stack.pop()
        if os.path.isdir(current_path):
            print(f"[DIR] {current_path}")
            # 将当前目录的内容加入栈
            for entry in sorted(os.listdir(current_path), reverse=True):
                stack.append(os.path.join(current_path, entry))
        else:
            print(f"[FILE] {current_path}")

# 调用函数
start_path = "./test_directory"  # 替换为需要遍历的目录
dfs_directory_stack(start_path)

也可以直接使用 Shell 实现,不用写代码,Shell 脚本中可以使用 find 命令来实现深度优先遍历:

find ./test_directory

输出:

./test_directory
./test_directory/file1.txt
./test_directory/subdir1
./test_directory/subdir1/file2.txt
./test_directory/subdir1/file3.txt
./test_directory/subdir2
./test_directory/subdir2/subsubdir
./test_directory/subdir2/subsubdir/file4.txt
深度优先遍历的应用场景
  • 文件搜索:
    • 在复杂的目录树中查找特定文件或文件类型。
    • 示例:查找所有 .txt 文件:
import os

def find_txt_files(path):
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith(".txt"):
                print(os.path.join(root, file))

find_txt_files("./test_directory")
  • 目录大小统计:
    • 统计目录及其子目录的总大小。
    • 示例代码:
import os

def calculate_directory_size(path):
    total_size = 0
    for root, dirs, files in os.walk(path):
        for file in files:
            file_path = os.path.join(root, file)
            total_size += os.path.getsize(file_path)
    return total_size

print(f"Total size: {calculate_directory_size('./test_directory')} bytes")
  • 备份工具:遍历目录树并复制文件到备份位置。
  • 文件清理:删除某些特定类型的文件或空文件夹。
  • 目录树展示:以树状结构展示目录层级。

使用深度优先遍历具有诸多好处:递归实现方式与目录树结构天然契合,代码思路简单直观适合嵌套结构,能深入到子目录,适合操作深层嵌套的目录;占用资源少:在处理大目录时,深度优先遍历通常比广度优先遍历占用内存更少。不过,在应用过程中也需要注意一些可能会出现的问题:① 可能导致栈溢出:如果目录嵌套过深,递归实现可能导致栈溢出。② 目录顺序不固定:由于深度优先的遍历顺序,无法保证目录按字母顺序排列。

深度优先遍历目录是一种高效、灵活的目录操作方法,尤其适用于嵌套结构的文件系统。通过递归或栈实现深度优先遍历,可以方便地完成文件搜索、目录统计等任务。我们以上提供了三种不同的实现方式(但代码思路是一致的),综上。希望该内容能对你有帮助,感谢您的阅读!

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

标签:遍历,编程,test,IO,directory,path,os,目录
From: https://blog.csdn.net/qq_39725309/article/details/145118705

相关文章

  • 用Ingress生成route,如何让生成route的insecureEdgeTerminationPolicy 的值为Allow
    对于此功能当前还没有实现,相关的新功能添加的Jiraticket如下:Annotatetheingresstocreatetheroutewiththespec.tls.insecureEdgeTerminationPolicysettoAllow目前已经实现的功能:apiVersion:networking.k8s.io/v1kind:Ingressmetadata:annotations:......
  • Stable Diffusion基础介绍
    前言❝在人工智能生成内容(AIGC)领域,StableDiffusion是一个具有里程碑意义的创新技术,它重新定义了如何通过AI生成高质量图像。该技术通过其独特的扩散模型,不仅在技术层面上取得了重要突破,更是在广告、游戏开发、医学影像等多个行业中得到了广泛的实际应用。作为一名深耕AI......
  • 编程语言C#简介
    C#是一种通用、高级的面向对象编程语言。它由微软公司开发,最早发布于2000年。C#主要用于开发Windows平台上的应用程序,包括桌面应用程序、Web应用程序和移动应用程序。C#被设计为一种简单、现代和健壮的语言。它结合了C和C++的优点,并加入了一些Java和其他编程语言的特性。C#具......
  • StableDiffusion筑梦工业愿景蔚蓝XL模型:时尚与科技的完美结合,尖端科技穿戴,精美壁纸级
    筑梦工业|愿景蔚蓝XL模型愿景蔚蓝XL模型简介今天介绍一款高质量的时尚与科技装备模型:筑梦工业|愿景蔚蓝XL,这是一款以追求极致时尚美学同时兼具最新科技武器设定的SDXLLoRA绘图模型。能够生成新一代眼镜/目镜/面罩/面具的模型,拥有大胆的色彩以及前沿的时尚审美。......
  • 树莓派-11-GPIO的应用之开关实验
    文章目录1GPIO编码方式2RPI.GPIO2.1PWM2.2静态函数2.3DATA3开关实验3.1按键开关实验3.2倾斜开关实验3.3震动开关实验3.4迷你磁簧开关实验4附录4.1异常及解决4.2参考资料1GPIO编码方式wiringPi和BCM和BOARD编码树莓派上提供......
  • Cookie和Session
    会话:有状态会话:客户端知道发起请求的是谁无状态会话:不知道发起请求的是谁只知道有请求http是无状态请求保存会话信息的两种技术:可以通过Cookie和Session储存会话信息cookie:客户端技术   信心存在客户端由服务器创建,通过响应发送给客户端,并且保存在客户浏览器的......
  • 深入探索 DeepSeek-V3 的算法创新:Multi-head Latent Attention 的实现与细节
    引言在当今的大规模语言模型(LLM)领域,随着模型参数规模的指数级增长,如何在保证性能的同时优化计算效率和内存使用成为了一个核心挑战。DeepSeek-V3模型以其创新的架构和训练策略脱颖而出,其中Multi-headLatentAttention(MLA)是其关键技术之一。MLA的引入不仅解决了传统......
  • Python异步编程在股票交易系统中的应用:如何减少延迟提升效率
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • Flux Images Generation API 对接说明
    本文将介绍一种FluxImagesGenerationAPI对接说明,它是可以通过输入自定义参数来生成Flux官方的图片。接下来介绍下FluxImagesGenerationAPI的对接说明。申请流程要使用API,需要先到FluxImagesGenerationAPI对应页面申请对应的服务,进入页面之后,点击「Acquir......
  • 网络编程I/O多路复用—动态数组
    函数声明#ifndef__VECTOR_H__#define__VECTOR_H__typedefstruct{ int*fd; intcounter; intmax_counter;}VectorFD;externVectorFD*create_vector_fd(void);externvoid destroy_vector_fd(VectorFD*);externint get_fd(VectorFD*,intindex);ext......