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

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

Vivado2023是一款集成开发环境软件,用于设计和验证FPGA(现场可编程门阵列)和可编程逻辑器件。对于使用Vivado2023的用户来说,license是必不可少的。 Vivado2023的license是一种许可证,用于授权用户合法使用该软件。许可证分为多种类型,包括评估许可证、开发许可证和节点许可证等。每种许可证都有不同的使用条件和功能。 评估许可证是免费提供的,让用户可以在一段时间内试用Vivado2023的全部功能。用户可以使用这个许可证来了解软件的性能和特点,对于初学者和小规模项目来说是一个很好的选择。但是,使用评估许可证的用户在使用期限过后需要购买正式的许可证才能继续使用软件。 开发许可证是付费的,可以永久使用Vivado2023的全部功能。这种许可证适用于需要长期使用Vivado2023进行开发的用户,通常是专业的FPGA设计师或工程师。购买开发许可证可以享受Vivado2023的技术支持和更新服务,确保软件始终保持最新的版本和功能。 节点许可证是用于多设备或分布式设计的许可证,可以在多个计算机上安装Vivado2023,并共享使用。节点许可证适用于大规模项目或需要多个处理节点进行设计的用户,可以提高工作效率和资源利用率。 总之,Vivado2023 license是用户在使用Vivado2023时必须考虑的问题。用户可以根据自己的需求选择合适的许可证类型,以便获取最佳的软件使用体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值