欢迎来到我的IO mkdir()大讲堂!今天我们要学习如何使用文件系统函数来创建目录。在开始之前,我想先提醒大家,我的讲解风格可能有点幽默,因为编程有时候也需要一些乐趣,不是吗?
首先,我们先来看一下什么是mkdir()
。mkdir()
是一个C语言函数,用于在文件系统中创建新的目录。它的函数原型是:int mkdir(const char *pathname, mode_t mode);
。这个函数需要两个参数:要创建的目录的路径和要设置的权限模式。
#include // 包含 mkdir 函数
#include // 包含 mkdir 函数
int main() {
// 尝试创建一个新目录
if (mkdir("new_directory", 0755) == -1) {
perror("mkdir failed"); // 如果 mkdir 失败,打印错误信息
return 1;
}
return 0;
}
这段代码会尝试在当前工作目录下创建一个名为new_directory
的新目录。如果目录创建成功,mkdir()
会返回0。如果失败,它会返回-1,并设置全局变量errno
以表示错误类型。在这个例子中,我们使用perror()
函数来打印错误信息。
接下来我们来看一下opendir()
和closedir()
。这两个函数用于打开和关闭目录流.opendir()
函数会返回一个指向目录流的指针,而closedir()
函数会关闭这个目录流。这两个函数的原型如下:
DIR *opendir(const char *name);
int closedir(DIR *dir);
#include // 包含 opendir 和 closedir 函数
#include // 包含 printf 函数
int main() {
// 打开目录流
DIR *dir = opendir(".");
if (dir == NULL) {
printf("opendir failed\n"); // 如果 opendir 失败,打印错误信息
return 1;
}
// 读取目录中的文件列表
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name); // 打印文件名
}
// 关闭目录流
if (closedir(dir) == -1) {
printf("closedir failed\n"); // 如果 closedir 失败,打印错误信息
return 1;
}
return 0;
}
这段代码会打开当前工作目录的目录流,然后读取并打印出目录中的所有文件名。然后它会关闭目录流。如果在打开或关闭目录流时出现问题,程序会打印出错误信息并返回1。
让我们继续看另一个重要的函数:readdir()
。这个函数用于读取目录流中的条目。它的原型是:struct dirent *readdir(DIR *dir);
。它会返回一个指向dirent
结构的指针,该结构包含目录项的信息,例如文件名和文件类型。
如果readdir()
成功,它会返回一个指向dirent
结构的非空指针。如果目录已经读取完毕,它返回NULL。如果发生错误,它返回NULL并设置全局变量errno
以表示错误类型。
(1)dirent
结构体d_name
:文件或目录的名称。d_type
:文件或目录的类型。这可能是以下类型之一:DT_REG
表示普通文件,DT_DIR
表示目录,DT_LNK
表示符号链接,DT_FIFO
表示命名管道,DT_SOCK
表示套接字,DT_UNKNOWN
表示未知类型。d_ino
:文件或目录的inode编号。d_off
:文件或目录的偏移量。d_reclen
:文件或目录的记录长度。d_type
:文件或目录的类型。d_namlen
:文件或目录名称的长度。#include // 包含 readdir 函数
#include // 包含 printf 函数
int main() {
// 打开目录流
DIR *dir = opendir(".");
if (dir == NULL) {
printf("opendir failed\n"); // 如果 opendir 失败,打印错误信息
return 1;
}
// 读取目录中的文件列表
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name); // 打印文件名
}
// 关闭目录流
if (closedir(dir) == -1) {
printf("closedir failed\n"); // 如果 closedir 失败,打印错误信息
return 1;
}
return 0;
}
这段代码会打开当前工作目录的目录流,然后使用readdir()
循环读取并打印出目录中的所有文件名。然后它会关闭目录流。如果在打开或关闭目录流时出现问题,程序会打印出错误信息并返回1。
当你使用opendir()
打开一个目录流后,操作系统会为这个流分配一些资源,例如内存和文件描述符。如果你不再需要这个流,但没有关闭它,操作系统将无法释放这些资源,这可能导致内存泄漏或其他问题。因此,为了确保资源的正确释放,你需要在读取完目录后立即使用closedir()
关闭目录流。
opendir()
和readdir()
返回的错误? 在使用opendir()
和readdir()
时,你需要注意错误处理。如果opendir()
失败,它会返回NULL,你需要检查errno
来确定错误的原因。如果readdir()
失败,它也会返回NULL,同样需要检查errno
来获取错误信息。
使用opendir()
和readdir()
可以很容易地遍历目录中的所有文件。但如果你还需要遍历子目录,就需要进行递归处理。在递归过程中,你可以使用opendir()
和readdir()
来打开子目录并获取其中的文件列表。
readdir()
返回的dirent
结构体的d_type
字段可以告诉你一个目录项是文件还是目录。如果d_type
是DT_REG
,则表示一个普通文件;如果d_type
是DT_DIR
,则表示一个目录。
在某些情况下,目录中的条目可能是一个符号链接,而不是一个实际的文件或目录。符号链接类似于Windows中的快捷方式,它指向另一个文件或目录。你可以使用lstat()
函数来检查一个条目是否是符号链接,并在需要时解析它的目标。
值得注意的是,在使用opendir()
和readdir()
时,需要小心处理目录流的关闭。如果忘记关闭目录流,可能会导致内存泄漏或其他问题。因此,一定要记得在读取完目录后使用closedir()
函数关闭目录流。