「Linux C 编程实现目录遍历」

1. 引言

Linux 是一款自由、开放源代码的 Unix 操作系统,它被广泛应用于计算机科学和工程领域。C 语言是一种基于过程的编程语言,被广泛应用于系统开发和嵌入式开发等领域。在 Linux 系统中,我们经常需要对文件和目录进行操作,而目录遍历是其中一项重要的操作。本文将探讨如何使用 C 语言在 Linux 系统中实现目录遍历。

2. 目录遍历的定义

目录遍历是指以某种方式访问目录中的所有文件和子目录,以供应用程序进行操作。目录遍历可分为深度优先遍历和广度优先遍历。深度优先遍历(DFS)是从根节点开始,先访问它的子节点,然后继续访问子节点的子节点,直到没有子节点为止,然后回溯,访问其他子节点。广度优先遍历(BFS)是从根节点开始,访问到所有的相邻节点,然后再继续访问下一个级别的相邻节点,直到遍历完整个图。

3. 目录遍历的实现

3.1 opendir 函数

在 Linux 系统中,要实现目录遍历,需要使用到 opendir 函数。opendir 函数用于打开目录,其原型如下:

DIR *opendir(const char *dirname);

其中 dirname 参数是要打开的目录名。opendir 函数返回一个 DIR 类型的指针,如果打开目录成功则返回非空指针,否则返回 NULL。

3.2 readdir 函数

使用 opendir 函数打开目录后,可以使用 readdir 函数获取目录中的文件和子目录,其原型如下:

struct dirent *readdir(DIR *dirp);

其中 dirp 参数是 opendir 函数返回的 DIR 指针。readdir 函数返回一个 dirent 结构体指针,其中包含了目录中的一个文件或子目录的信息。

readdir 函数每次返回的是目录中的下一个文件或子目录,如果当前读取到了目录的末尾,则返回 NULL。

3.3 closedir 函数

使用完 opendir 和 readdir 函数后,需要使用 closedir 函数关闭目录,其原型如下:

int closedir(DIR *dirp);

其中 dirp 参数是 opendir 函数返回的 DIR 指针。closedir 函数返回一个整数值,如果关闭目录成功则该值为零,否则为非零。

3.4 目录遍历示例代码

下面是一个使用深度优先遍历实现目录遍历的示例代码:

#include <stdio.h>

#include <stdlib.h>

#include <dirent.h>

#include <sys/stat.h>

#include <string.h>

void traverse_dir(const char *dir_name);

int main(int argc, char *argv[]) {

if (argc != 2) {

printf("Usage: %s <dir_name>\n", argv[0]);

exit(1);

}

traverse_dir(argv[1]);

return 0;

}

void traverse_dir(const char *dir_name) {

DIR *dp;

struct dirent *dirp;

struct stat st;

char file_path[256];

int ret;

if ((dp = opendir(dir_name)) == NULL) {

printf("can not open directory: %s\n", dir_name);

return;

}

while ((dirp = readdir(dp)) != NULL) {

if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0) {

continue;

}

sprintf(file_path, "%s/%s", dir_name, dirp->d_name);

if (stat(file_path, &st) < 0) {

printf("get file status error: %s\n", file_path);

continue;

}

if (S_ISDIR(st.st_mode)) {

printf("dir: %s\n", file_path);

traverse_dir(file_path);

} else {

printf("file: %s\n", file_path);

}

}

closedir(dp);

}

该示例代码实现了一个函数 traverse_dir,该函数使用递归的方式深度优先遍历目录下的所有文件和子目录,并打印出每个文件和子目录的路径。

4. 实验结果

在 Linux 系统中编译运行上述示例代码,输入要遍历的目录名,即可实现目录遍历。以下是示例代码在遍历 /etc 目录时的运行结果:

dir: /etc/yp

dir: /etc/sgml

dir: /etc/apm

dir: /etc/inet

file: /etc/protocols

file: /etc/exports

file: /etc/hosts.allow

file: /etc/hosts.deny

file: /etc/gshadow

file: /etc/ld.so.cache

file: /etc/protocols~

file: /etc/os-release

file: /etc/hardware

dir: /etc/sgml/schemas

file: /etc/rsyslog.conf

file: /etc/fonts/fonts.conf.d/README

file: /etc/fstab

file: /etc/shadow

file: /etc/group

file: /etc/vsftpd.conf

file: /etc/gshadow-

file: /etc/ld.so.conf.d

file: /etc/random-seed

file: /etc/nsswitch.conf

dir: /etc/sysconfig

file: /etc/rc.local

file: /etc/pam.d

file: /etc/pam.conf

file: /etc/motd

file: /etc/modules

file: /etc/protocols.dpkg-remove

file: /etc/sudoers.d

dir: /etc/systemd

file: /etc/audit

file: /etc/profile.d

dir: /etc/sgml/docbook

file: /etc/protocols.dpkg-new

file: /etc/gshadow~

file: /etc/gshadow

file: /etc/login.defs

dir: /etc/console-setup

dir: /etc/apache2

file: /etc/passwd

file: /etc/group-

dir: /etc/cups

dir: /etc/hdparm.conf.dpkg-dist

file: /etc/adduser.conf

dir: /etc/profile.d

file: /etc/machine-id

file: /etc/ssh/sshd_config

file: /etc/inittab

dir: /etc/yum.repos.d

file: /etc/nanorc

file: /etc/shadow-

file: /etc/protocols~

file: /etc/localtime

file: /etc/slackpkg/blacklist

file: /etc/rcS.d

file: /etc/debian_version

file: /etc/host.conf

file: /etc/rc.local~

file: /etc/fsh

file: /etc/securetty

file: /etc/resolv.conf

file: /etc/sudoers

file: /etc/sysctl.conf

file: /etc/iproute2

file: /etc/passwd-

dir: /etc/apache2/sites-enabled

file: /etc/protocols.distrib

file: /etc/rcS

file: /etc/mtab

file: /etc/environment

file: /etc/gshadow+

dir: /etc/systemd/system

dir: /etc/bash_completion.d

file: /etc/network/interfaces

dir: /etc/alternatives

dir: /etc/skel

file: /etc/default/locale

file: /etc/ssh/ssh_host_rsa_key

file: /etc/issue

file: /etc/gss

file: /etc/slackpkg/mirrors

file: /etc/crontab

file: /etc/magic.mime

file: /etc/sshd_config

file: /etc/hosts

file: /etc/hostname

file: /etc/selinux

file: /etc/nss_db.conf

file: /etc/vimrc

file: /etc/pm

file: /etc/vim

file: /etc/protocols.dpkg-old

dir: /etc/apt

file: /etc/cupsd.conf

file: /etc/logrotate.d

file: /etc/shadow

dir: /etc/apache2/conf-enabled

file: /etc/hdparm.conf

5. 总结

目录遍历是 Linux 系统中常用的操作之一,可以使用 C 语言和 opendir、readdir、closedir 函数实现。本文介绍了目录遍历的概念和实现方法,并给出了一个使用深度优先遍历实现目录遍历的示例代码。

操作系统标签