You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:22:41