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;
}
相关推荐
FoldWinCard8 小时前
D5 Linux 网络及端口命令
linux·运维·服务器
零涂毕业设计10 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
tedcloud12310 小时前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
霸道流氓气质10 小时前
KMS 密钥管理服务(Key Management Service)原理与实践
linux·服务器·数据库
SakitamaX10 小时前
LVS(Linux Virtual Server)概念详解
linux·运维·lvs
小张同学a.10 小时前
Linux系统管理
linux·运维
阿龙的工作记录11 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
代码村新手11 小时前
Linux的基本指令
linux·运维·服务器
hkj880811 小时前
Ubuntu 切换java版本
java·linux·ubuntu
撩得Android一次心动13 小时前
Linux编程笔记3【个人用】
linux·笔记