Linux下如何用C/C++列出挂载卷及分区下的文件、目录等内容
解决Ubuntu下C/C++遍历挂载分区内容的问题
首先明确:/dev/sda、/dev/sfdx是块设备文件,不是可直接遍历的文件系统目录。你需要先将这些分区挂载到一个空目录(挂载点),才能访问分区内的文件结构。
步骤1:挂载分区(前置操作)
先通过命令行完成挂载(需sudo权限):
# 创建挂载点目录 sudo mkdir -p /mnt/sda # 挂载/dev/sda到/mnt/sda(根据文件系统类型调整,比如ext4) sudo mount /dev/sda /mnt/sda
挂载完成后,你的C/C++代码需要访问/mnt/sda这类挂载点路径,而非/dev/sda本身。
步骤2:C/C++递归遍历实现
以下代码会递归遍历指定路径下的所有目录、子目录、普通文件和符号链接,同时区分文件类型:
#include <stdio.h> #include <dirent.h> #include <sys/stat.h> #include <string.h> #include <errno.h> void traverse_path(const char* path) { DIR* dir = opendir(path); if (!dir) { fprintf(stderr, "无法打开目录 %s: %s\n", path, strerror(errno)); return; } struct dirent* direntp; while ((direntp = readdir(dir)) != NULL) { // 跳过当前目录(.)和上级目录(..) if (strcmp(direntp->d_name, ".") == 0 || strcmp(direntp->d_name, "..") == 0) { continue; } // 拼接完整路径 char full_path[1024]; snprintf(full_path, sizeof(full_path), "%s/%s", path, direntp->d_name); // 获取文件属性(用lstat不跟随符号链接,stat会自动跳转至链接目标) struct stat st; if (lstat(full_path, &st) == -1) { fprintf(stderr, "无法获取文件属性 %s: %s\n", full_path, strerror(errno)); continue; } // 判断文件类型并输出 printf("路径: %s ", full_path); if (S_ISDIR(st.st_mode)) { printf("[目录]\n"); // 递归遍历子目录 traverse_path(full_path); } else if (S_ISLNK(st.st_mode)) { printf("[符号链接]\n"); } else if (S_ISREG(st.st_mode)) { printf("[普通文件]\n"); } else { printf("[其他类型]\n"); } } closedir(dir); } int main() { // 替换为你的挂载点路径,比如/mnt/sda const char* mount_point = "/mnt/sda"; traverse_path(mount_point); return 0; }
关键说明
- lstat与stat的区别:
lstat用于获取符号链接本身的属性,stat会自动跳转至符号链接指向的目标文件。若需要查看符号链接的目标路径,可在判断为符号链接后调用readlink函数。 - 权限问题:运行程序时需拥有挂载点的访问权限,否则会出现无法打开目录的错误。
- 循环规避:若遇到指向父目录的符号链接,递归会进入死循环,实际使用中可通过记录已访问的inode来避免该问题(可选优化)。
- 文件系统兼容性:挂载时需指定正确的文件系统类型(如ext4、xfs),否则挂载失败后无法访问分区内容。
内容的提问来源于stack exchange,提问作者Witty Apps
相关产品推荐
相关产品推荐

