Linux系统编程—目录流

此文章为本人学习笔记,若有错误求指正,自学推荐书籍《Linux/UNIX系统编程手册》,需要该书籍pdf文档可无偿分享。

目录的概念

目录(directory)是文件系统中的一个重要概念,用于组织和管理文件。它就像一个容器,可以包含文件和其他目录。目录的主要作用是将文件分组,使文件系统更加有序和易于管理。每个目录都有一个名字,并且可以包含子目录和文件。

头文件

使用目录流相关操作时,需要包含以下头文件:

#include <dirent.h>    // 目录流操作相关函数
#include <sys/types.h> // 一些数据类型的定义,例如DIR

结构体

DIR是一个目录流的结构体,用于表示一个目录流。

struct DIR {
    int dd_fd;         // 目录流文件描述符
    long dd_loc;       // 目录流当前位置
    long dd_size;      // 目录流缓冲区大小
    char *dd_buf;      // 目录流缓冲区指针
    int dd_len;        // 目录流缓冲区中已读取的数据长度
    long dd_seek;      // 目录流偏移量
    int dd_flags;      // 目录流标志
};

相关函数

  • opendir()
  • readdir()
  • mkdir()
  • chdir()
  • rmdir()
  • remove()
  • rename()

1. opendir()

打开一个目录并返回一个目录流指针。

DIR *opendir(const char *name);
参数:

name:目录名。

返回值:

成功时返回指向DIR结构的指针,失败时返回NULL。

示例:

DIR *dir = opendir("/path/to/directory");
if (dir == NULL) {
    perror("opendir");
    exit(EXIT_FAILURE);
}

2. readdir()

读取目录流中的下一个目录项。

struct dirent *readdir(DIR *dirp);
参数:

dirp:指向目录流的指针。

返回值:

成功时返回指向dirent结构的指针,失败时返回NULL。

示例:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}

3. mkdir()

创建一个新的目录。

int mkdir(const char *pathname, mode_t mode);
参数:

pathname:目录名。

mode:新目录的权限位。

返回值:

成功时返回0,失败时返回-1。

示例:
if (mkdir("/path/to/new_directory", 0755) == -1) {
    perror("mkdir");
    exit(EXIT_FAILURE);
}

4. chdir()

改变当前工作目录。

cint chdir(const char *path);
参数:

path:新工作目录的路径。

返回值:

成功时返回0,失败时返回-1。

示例:
if (chdir("/path/to/new_directory") == -1) {
    perror("chdir");
    exit(EXIT_FAILURE);
}

5. rmdir()

删除一个空目录。

int rmdir(const char *pathname);
参数:

pathname:目录名。

返回值:

成功时返回0,失败时返回-1。

示例:
if (rmdir("/path/to/directory") == -1) {
    perror("rmdir");
    exit(EXIT_FAILURE);
}

6. remove()

删除一个文件或目录。

int remove(const char *pathname);
参数:

pathname:文件或目录名。

返回值:

成功时返回0,失败时返回-1。

示例:
if (remove("/path/to/file_or_directory") == -1) {
    perror("remove");
    exit(EXIT_FAILURE);
}

7. rename()

重命名文件或目录。

int rename(const char *oldpath, const char *newpath);
参数:

oldpath:旧文件或目录名。

newpath:新文件或目录名。

返回值:

成功时返回0,失败时返回-1。

示例:
if (rename("/path/to/old_name", "/path/to/new_name") == -1) {
    perror("rename");
    exit(EXIT_FAILURE);
}

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
    DIR *dir;
    struct dirent *entry;

    // 打开目录
    if ((dir = opendir("/path/to/directory")) == NULL) {
        perror("opendir");
        return EXIT_FAILURE;
    }

    // 读取目录内容
    while ((entry = readdir(dir)) != NULL) {
        printf("Filename: %s\n", entry->d_name);
    }

    // 关闭目录
    closedir(dir);

    // 创建新目录
    if (mkdir("/path/to/new_directory", 0755) == -1) {
        perror("mkdir");
        return EXIT_FAILURE;
    }

    // 改变当前工作目录
    if (chdir("/path/to/new_directory") == -1) {
        perror("chdir");
        return EXIT_FAILURE;
    }

    // 删除空目录
    if (rmdir("/path/to/new_directory") == -1) {
        perror("rmdir");
        return EXIT_FAILURE;
    }

    // 删除文件或目录
    if (remove("/path/to/file_or_directory") == -1) {
        perror("remove");
        return EXIT_FAILURE;
    }

    // 重命名文件或目录
    if (rename("/path/to/old_name", "/path/to/new_name") == -1) {
        perror("rename");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

总结

本文章介绍了目录和文件夹的概念、相关头文件、结构体和常用函数,包括opendir()、readdir()、mkdir()、chdir()、rmdir()、remove()和rename(),并提供了完整的示例代码。通过这些内容,可以掌握目录流操作的方法和技巧。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值