此文章为本人学习笔记,若有错误求指正,自学推荐书籍《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(),并提供了完整的示例代码。通过这些内容,可以掌握目录流操作的方法和技巧。