自学内容网 自学内容网

Linux 目录操作详解

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

1. 获取当前工作目录

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

1.1 getcwd()

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

函数原型:

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

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

1.2 get_current_dir_name()

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

函数原型:

char *get_current_dir_name(void);

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

2. 切换工作目录

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

2.1 chdir()

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

函数原型:

int chdir(const char *path);
  • path:目标目录的路径。

返回值:

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

3. 创建和删除目录

3.1 mkdir()

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

函数原型:

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

返回值:

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

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

函数原型:

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

返回值:

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

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

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

4.1 opendir() 打开目录

函数原型:

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

返回值:

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

函数原型:

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

返回值:

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

函数原型:

int closedir(DIR *dirp);
  • dirp:需要关闭的目录流。

返回值:

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

5. dirent 结构体

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

结构体定义:

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()获取当前工作目录:

#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()函数来切换工作目录:

#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()删除空目录:

#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()来遍历目录中的文件:

#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)结合所有操作的示例

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

#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;
}

原文地址:https://blog.csdn.net/qq_45797625/article/details/145292729

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!