当前位置: 首页 > news >正文

Linux目录操作学习总结


一、核心概念
  1. 目录的本质

    • Linux中目录是一种特殊文件,存储当前目录下的文件及子目录信息。
    • 根目录为/,所有文件和目录均从根目录开始组织。
  2. 目录操作核心函数

    • 打开目录DIR *opendir(const char *name)
    • 读取目录项struct dirent *readdir(DIR *dir)
    • 关闭目录int closedir(DIR *dir)
    • 创建目录int mkdir(const char *pathname, mode_t mode)
    • 删除空目录int rmdir(const char *dirname)
    • 重命名/删除文件int rename(const char *oldpath, const char *newpath)int remove(const char *pathname)

二、关键数据结构
1. DIR结构体
typedef struct __dirstream DIR;  // 表示目录流,用于操作目录
  • 通过opendir返回的DIR*指针管理目录流。
2. dirent结构体
struct dirent {
    ino_t d_ino;           // 索引节点号
    off_t d_off;           // 目录文件中的偏移
    unsigned short d_reclen; // 记录长度
    unsigned char d_type;   // 文件类型标识
    char d_name[256];      // 文件名(最长255字符)
};
  • d_type取值
    enum {
        DT_UNKNOWN = 0,    // 未知类型
        DT_FIFO = 1,        // 管道文件
        DT_CHR = 2,         // 字符设备文件
        DT_DIR = 4,         // 目录
        DT_BLK = 6,         // 块设备文件
        DT_REG = 8,         // 普通文件
        DT_LNK = 10,        // 符号链接
        DT_SOCK = 12        // 套接字文件
    };
    

三、目录操作函数详解
1. 遍历目录并输出文件信息
#include <dirent.h>
#include <stdio.h>

int main() {
    DIR *dir = opendir(".");  // 打开当前目录
    if (!dir) {
        perror("目录打开失败");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {  // 逐项读取目录内容
        printf("文件名: %-20s 类型: ", entry->d_name);
        switch (entry->d_type) {
            case DT_REG:  printf("普通文件\n"); break;
            case DT_DIR: printf("目录\n"); break;
            case DT_LNK: printf("符号链接\n"); break;
            default:      printf("其他类型\n");
        }
    }

    closedir(dir);  // 关闭目录
    return 0;
}

输出示例

文件名: .                  类型: 目录
文件名: ..                 类型: 目录
文件名: test.txt          类型: 普通文件
文件名: link              类型: 符号链接

2. 创建目录并检查权限
#include <sys/stat.h>
#include <stdio.h>

int main() {
    if (mkdir("new_dir", 0755) == -1) {  // 创建目录,权限为rwxr-xr-x
        perror("目录创建失败");
        return 1;
    }
    printf("目录创建成功\n");
    return 0;
}

输出

目录创建成功

四、综合例题

题目:实现类似ls -l的功能,输出目录下文件的详细信息(名称、类型、inode号)。

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

int main() {
    DIR *dir = opendir(".");
    if (!dir) {
        perror("目录打开失败");
        return 1;
    }

    struct dirent *entry;
    struct stat st;

    while ((entry = readdir(dir)) != NULL) {
        if (stat(entry->d_name, &st) == -1) {
            perror("stat失败");
            continue;
        }
        printf("文件名: %-15s Inode: %-8lu 类型: ", entry->d_name, st.st_ino);
        switch (entry->d_type) {
            case DT_REG:  printf("普通文件\n"); break;
            case DT_DIR: printf("目录\n"); break;
            case DT_LNK: printf("符号链接\n"); break;
            default:      printf("其他类型\n");
        }
    }

    closedir(dir);
    return 0;
}

输出示例

文件名: .               Inode: 123456   类型: 目录
文件名: test.txt        Inode: 789012   类型: 普通文件
文件名: link            Inode: 345678   类型: 符号链接

五、常见问题
  1. 目录遍历遗漏readdir不会自动过滤.(当前目录)和..(上级目录),需手动处理。
  2. 文件类型判断d_type可能返回DT_UNKNOWN(如某些文件系统不支持),此时需用stat函数进一步检查。
  3. 权限不足:创建目录时需确保父目录有写权限。

总结

  1. 核心操作:打开、遍历、关闭目录是目录操作的基础,需熟练使用opendirreaddirclosedir
  2. 数据结构dirent结构体提供文件名和类型,结合stat可获取更详细属性(如inode、大小)。
  3. 应用场景
    • 文件管理器开发
    • 批量文件处理(如备份、清理)
    • 系统工具实现(如lsfind

通过结合目录操作函数和文件属性查询,可实现复杂的文件系统管理功能。

相关文章:

  • AI辅助的黑客攻击
  • docker最新源,及遇到问题+处理
  • 利用Python爬虫获取Shopee(虾皮)商品详情:实战指南
  • 【Linux】VMware 17 安装 VMware Tools
  • HAl库开发中断方式接收Can报文的详细流程
  • 深入自制Shell:解锁Linux进程控制的实践密码
  • Python散点密度图(Scatter Density Plot):数据可视化的强大工具
  • 深入理解ThreadLocal:线程安全的“独享空间”
  • 智慧共享杆:城市智能化管理的 “多面手”
  • Linux 用户与组管理实战:经验分享与最佳实践
  • Oracle OCP认证是否值得考?
  • Unity 中实例化预制体的完整过程
  • 第7章 类与面向对象
  • linux性能监控的分布式集群 prometheus + grafana 监控体系搭建
  • 华为终端销售模式转型变革项目总体汇报方案(183页PPT)(文末有下载方式)
  • WordPress漏洞
  • 【Vue3】01-vue3的基础 + ref reactive
  • 大白话详细解读函数之柯里化
  • AI全天候智能助手,为您构建私人数据库
  • JVM的组成--运行时数据区
  • 年在沪纳税350亿人民币,这些全球头部企业表示“对上海承诺不会变”
  • 伊朗最高领袖顾问:伊朗愿承诺永不制造核武,换取美解除制裁
  • 习近平复信中国丹麦商会负责人
  • 美国务院批准向土耳其出售导弹及相关部件,价值3.04亿美元
  • 诠释微末处的丰盈:“上海制造佳品汇”首届海外专场即将亮相日本大阪
  • 法治课|争议中的“行人安全距离”于法无据,考量“注意义务”才更合理