Linux 目录操作详解

Linux目录操作详解

      • [1. 获取当前工作目录](#1. 获取当前工作目录)
        • [1.1 getcwd()](#1.1 getcwd())
        • [1.2 get_current_dir_name()](#1.2 get_current_dir_name())
      • [2. 切换工作目录](#2. 切换工作目录)
        • [2.1 chdir()](#2.1 chdir())
      • [3. 创建和删除目录](#3. 创建和删除目录)
        • [3.1 mkdir()](#3.1 mkdir())
        • [3.2 rmdir()](#3.2 rmdir())
      • [4. 获取目录中的文件列表](#4. 获取目录中的文件列表)
        • [4.1 opendir() 打开目录](#4.1 opendir() 打开目录)
        • [4.2 readdir() 读取目录内容](#4.2 readdir() 读取目录内容)
        • [4.3 closedir() 关闭目录](#4.3 closedir() 关闭目录)
      • [5. dirent 结构体](#5. dirent 结构体)
      • [6. 示例代码](#6. 示例代码)

本文将介绍常用的Linux目录操作函数,包括获取当前工作目录、切换工作目录、创建和删除目录等操作。

1. 获取当前工作目录

Linux提供了两个常用函数来获取当前工作目录。

1.1 getcwd()

该函数用于获取当前进程的工作目录,并将路径存储在用户提供的缓冲区中。

函数原型:

c 复制代码
char *getcwd(char *buf, size_t size);
  • buf:存储当前工作目录路径的缓冲区。
  • size:缓冲区的大小。

如果成功,返回当前工作目录的路径;如果失败,返回NULL,并设置errno。

1.2 get_current_dir_name()

这是一个较为简化的函数,不需要传入缓冲区,它会动态分配内存来存储当前目录的路径。

函数原型:

c 复制代码
char *get_current_dir_name(void);

调用此函数后,返回的字符串指向当前工作目录的路径,使用完后需要调用free()来释放内存。

2. 切换工作目录

切换工作目录的操作在文件操作中经常会用到。Linux提供了一个函数chdir()来实现该操作。

2.1 chdir()

该函数用于改变当前进程的工作目录。

函数原型:

c 复制代码
int chdir(const char *path);
  • path:目标目录的路径。

返回值:

  • 成功:返回0。
  • 失败:返回-1,errno会被设置为具体的错误码(如目录不存在或权限不足)。

3. 创建和删除目录

3.1 mkdir()

用于创建一个新目录。需要提供目录名和访问权限。

函数原型:

c 复制代码
int mkdir(const char *pathname, mode_t mode);
  • pathname:新目录的路径。
  • mode:目录权限,通常使用如0755来设定权限。

返回值:

  • 成功:返回0。
  • 失败:返回-1,errno会设置相应的错误。
3.2 rmdir()

用于删除一个空目录。删除时,目录必须为空。

函数原型:

c 复制代码
int rmdir(const char *path);
  • path:需要删除的目录路径。

返回值:

  • 成功:返回0。
  • 失败:返回-1,errno会设置具体的错误原因(如目录非空)。

4. 获取目录中的文件列表

获取目录中的文件列表通常需要遍历目录。Linux提供了一些API来帮助我们打开、读取和关闭目录。

4.1 opendir() 打开目录

函数原型:

c 复制代码
DIR *opendir(const char *pathname);
  • pathname:需要打开的目录路径。

返回值:

  • 成功:返回DIR*,即目录流。
  • 失败:返回NULLerrno设置为错误码。
4.2 readdir() 读取目录内容

函数原型:

c 复制代码
struct dirent *readdir(DIR *dirp);
  • dirp:通过opendir()获得的目录流。

返回值:

  • 成功:返回指向dirent结构体的指针,其中包含了当前目录项的信息。
  • 失败:返回NULL
4.3 closedir() 关闭目录

函数原型:

c 复制代码
int closedir(DIR *dirp);
  • dirp:需要关闭的目录流。

返回值:

  • 成功:返回0。
  • 失败:返回-1。

5. dirent 结构体

在通过readdir()函数获取目录项时,返回的是一个dirent结构体,该结构体定义了目录项的相关信息。

结构体定义:

c 复制代码
struct dirent {
    long d_ino;             // inode编号
    off_t d_off;            // 偏移量
    unsigned short d_reclen; // 目录项长度
    unsigned char d_type;   // 文件类型
    char d_name[NAME_MAX+1]; // 文件名
};
  • d_name:存储目录项的文件名,最大长度为255字符。
  • d_type:文件类型,可能的值包括普通文件(DT_REG)、目录(DT_DIR)、符号链接(DT_LNK)等。

6. 示例代码

(1) 获取当前工作目录

以下示例展示了如何使用getcwd()get_current_dir_name()获取当前工作目录:

c 复制代码
#include <iostream>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

int main() {
    // 使用getcwd()获取当前工作目录
    char path1[256];
    if (getcwd(path1, sizeof(path1)) != NULL) {
        cout << "Current working directory (getcwd): " << path1 << endl;
    } else {
        perror("getcwd failed");
    }

    // 使用get_current_dir_name()获取当前工作目录
    char *path2 = get_current_dir_name();
    if (path2 != NULL) {
        cout << "Current working directory (get_current_dir_name): " << path2 << endl;
        free(path2);  // 注意释放内存
    } else {
        perror("get_current_dir_name failed");
    }

    return 0;
}
(2)切换工作目录

示例展示了如何使用chdir()函数来切换工作目录:

c 复制代码
#include <iostream>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

int main() {
    // 获取当前工作目录
    char currentDir[256];
    if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
        cout << "Current working directory: " << currentDir << endl;
    } else {
        perror("getcwd failed");
        return 1;
    }

    // 切换到新的目录
    if (chdir("/home") == 0) {
        cout << "Changed working directory to /home" << endl;
    } else {
        perror("chdir failed");
        return 1;
    }

    // 获取切换后的工作目录
    if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
        cout << "New working directory: " << currentDir << endl;
    } else {
        perror("getcwd failed");
    }

    return 0;
}
(3)创建和删除目录

以下示例展示了如何使用mkdir()创建目录和rmdir()删除空目录:

c 复制代码
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>

using namespace std;

int main() {
    const char *dirName = "testDir";

    // 创建目录
    if (mkdir(dirName, 0755) == 0) {
        cout << "Directory " << dirName << " created successfully." << endl;
    } else {
        perror("mkdir failed");
        return 1;
    }

    // 删除目录
    if (rmdir(dirName) == 0) {
        cout << "Directory " << dirName << " deleted successfully." << endl;
    } else {
        perror("rmdir failed");
        return 1;
    }

    return 0;
}
(4)遍历目录中的文件

以下示例展示了如何使用opendir(), readdir(), 和 closedir()来遍历目录中的文件:

c 复制代码
#include <iostream>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

using namespace std;

int main() {
    const char *dirName = "/home";

    // 打开目录
    DIR *dir = opendir(dirName);
    if (dir == NULL) {
        perror("opendir failed");
        return 1;
    }

    struct dirent *entry;
    // 遍历目录中的文件
    cout << "Files in directory " << dirName << ":" << endl;
    while ((entry = readdir(dir)) != NULL) {
        cout << "File: " << entry->d_name << endl;
    }

    // 关闭目录
    closedir(dir);

    return 0;
}
(5)结合所有操作的示例

以下是一个较为完整的示例,结合了获取当前目录、切换目录、创建目录和遍历目录等操作:

c 复制代码
#include <iostream>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>

using namespace std;

int main() {
    char currentDir[256];
    
    // 获取当前工作目录
    if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
        cout << "Current working directory: " << currentDir << endl;
    } else {
        perror("getcwd failed");
        return 1;
    }

    // 创建目录
    const char *dirName = "exampleDir";
    if (mkdir(dirName, 0755) == 0) {
        cout << "Directory " << dirName << " created successfully." << endl;
    } else {
        perror("mkdir failed");
        return 1;
    }

    // 切换到新创建的目录
    if (chdir(dirName) == 0) {
        cout << "Changed to directory " << dirName << endl;
    } else {
        perror("chdir failed");
        return 1;
    }

    // 获取切换后的工作目录
    if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
        cout << "New working directory: " << currentDir << endl;
    } else {
        perror("getcwd failed");
    }

    // 列出当前目录中的文件
    DIR *dir = opendir(".");
    if (dir == NULL) {
        perror("opendir failed");
        return 1;
    }

    struct dirent *entry;
    cout << "Files in the current directory:" << endl;
    while ((entry = readdir(dir)) != NULL) {
        cout << "File: " << entry->d_name << endl;
    }

    // 关闭目录
    closedir(dir);

    // 删除目录
    if (rmdir(dirName) == 0) {
        cout << "Directory " << dirName << " deleted successfully." << endl;
    } else {
        perror("rmdir failed");
        return 1;
    }

    return 0;
}
相关推荐
李迟1 小时前
跨系统平台实践:在内网自建kylin服务版系统yum源
linux
odoo-卜永1 小时前
ubuntu22.04连接爱普生打印机型号L385
linux·经验分享·ubuntu
小麦嵌入式2 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
刘若水2 小时前
Linux: 进程信号初识
linux·运维·服务器
共享家95274 小时前
深入剖析Linux常用命令,助力高效操作
linux·运维·服务器
Zfox_5 小时前
【C++项目】从零实现RPC框架「四」:业务层实现与项目使用
linux·开发语言·c++·rpc·项目
吃旺旺雪饼的小男孩5 小时前
Ubuntu 22.04 安装和运行 EDK2 超详细教程
linux·运维·ubuntu
IT小馋猫5 小时前
Linux 企业项目服务器组建(附脚本)
linux·服务器·网络
阿政一号5 小时前
Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】
linux·运维·服务器·进程间通信
又过一个秋5 小时前
【sylar-webserver】7 定时器模块
linux·c++