linux目录创建,打开,读,关闭操作{mkdir(),opendir()/closedir(),readdir()}

        欢迎来到我的IO mkdir()大讲堂!今天我们要学习如何使用文件系统函数来创建目录。在开始之前,我想先提醒大家,我的讲解风格可能有点幽默,因为编程有时候也需要一些乐趣,不是吗?

一.创建新的目录

        首先,我们先来看一下什么是mkdir()mkdir()是一个C语言函数,用于在文件系统中创建新的目录。它的函数原型是:int mkdir(const char *pathname, mode_t mode);。这个函数需要两个参数:要创建的目录的路径和要设置的权限模式。 

(1)示例代码

#include  // 包含 mkdir 函数  
#include  // 包含 mkdir 函数  
  
int main() {  
    // 尝试创建一个新目录  
    if (mkdir("new_directory", 0755) == -1) {  
        perror("mkdir failed"); // 如果 mkdir 失败,打印错误信息  
        return 1;  
    }  
    return 0;  
}

 

(2)代码解释 

        这段代码会尝试在当前工作目录下创建一个名为new_directory的新目录。如果目录创建成功,mkdir()会返回0。如果失败,它会返回-1,并设置全局变量errno以表示错误类型。在这个例子中,我们使用perror()函数来打印错误信息。

 

 二.打开和关闭目录流

        接下来我们来看一下opendir()closedir()这两个函数用于打开和关闭目录流.opendir()函数会返回一个指向目录流的指针,而closedir()函数会关闭这个目录流。这两个函数的原型如下:

  • DIR *opendir(const char *name);
  • int closedir(DIR *dir);

(1)示例代码

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

 

(2)代码解释 

        这段代码会打开当前工作目录的目录流,然后读取并打印出目录中的所有文件名。然后它会关闭目录流。如果在打开关闭目录流时出现问题,程序会打印出错误信息并返回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:文件或目录名称的长度。

(2)示例代码

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

(3)代码解释  

         这段代码会打开当前工作目录的目录流,然后使用readdir()循环读取并打印出目录中的所有文件名。然后它会关闭目录流。如果在打开或关闭目录流时出现问题,程序会打印出错误信息并返回1。

四.常见问题

  1. 为什么在读取目录后需要关闭目录流?

        当你使用opendir()打开一个目录流后,操作系统会为这个流分配一些资源,例如内存和文件描述符。如果你不再需要这个流,但没有关闭它,操作系统将无法释放这些资源,这可能导致内存泄漏或其他问题。因此,为了确保资源的正确释放,你需要在读取完目录后立即使用closedir()关闭目录流。


2. 如何处理opendir()readdir()返回的错误?

        在使用opendir()readdir()时,你需要注意错误处理。如果opendir()失败,它会返回NULL,你需要检查errno来确定错误的原因。如果readdir()失败,它也会返回NULL,同样需要检查errno来获取错误信息。


3. 如何遍历目录中的所有文件和子目录?

        使用opendir()readdir()可以很容易地遍历目录中的所有文件。但如果你还需要遍历子目录,就需要进行递归处理在递归过程中,你可以使用opendir()readdir()来打开子目录并获取其中的文件列表。


4. 如何区分文件和目录?

  readdir()返回的dirent结构体的d_type字段可以告诉你一个目录项文件还是目录。如果d_typeDT_REG,则表示一个普通文件;如果d_typeDT_DIR,则表示一个目录


5. 如何处理符号链接?

        在某些情况下,目录中的条目可能是一个符号链接,而不是一个实际的文件或目录。符号链接类似于Windows中的快捷方式,它指向另一个文件或目录。你可以使用lstat()函数检查一个条目是否是符号链接,并在需要时解析它的目标。

 四.总结

        值得注意的是,在使用opendir()readdir()时,需要小心处理目录流的关闭。如果忘记关闭目录流,可能会导致内存泄漏或其他问题。因此,一定要记得在读取完目录后使用closedir()函数关闭目录流。 

你可能感兴趣的:(linux,运维,服务器,开发语言,c语言)