# 目录 / 文件相关

# 存储信息的结构体:

  • DIR* dp : 某个目录的信息 (opendir 返回,做 readir 参数)

    头文件: dirent.h

    struct __dirstream   
       {   
        void *__fd;                   // 文件描述符
        char *__data;                 // 目录块
        int __entry_data;             //data 对应的条目号   
        char *__ptr;                  // 块中的当前指针
        int __entry_ptr;              // 条目号对应的指针  
        size_t __allocation;          // 为块分配的空间
        size_t __size;                // 块中的总有效数据
        __libc_lock_define (, __lock);// 此结构的互斥锁
       };   
        
    typedef struct __dirstream DIR;
  • struct dirent *entry : 某个文件在目录里的简略信息 (readir 返回)

    头文件: dirent.h

    struct dirent
      {
        __ino_t d_ino;              // 文件的 inode 节点号
        __off_t d_off;              // 在目录文件中的偏移
        unsigned short int d_reclen;// 文件名字长度
        unsigned char d_type;       // 文件类型 
        char d_name[256];		    // 文件名字 
      };
  • stat 结构体 : 某个文件的详细信息

    struct stat {   
        mode_t st_mode;      // 文件类型、访问权限   
        ino_t st_ino;        // 索引节点号   
        dev_t st_dev;        // 文件使用的设备号   
        dev_t st_rdev;       // 设备文件的设备号   
        nlink_t st_nlink;    // 文件的硬连接数    
        uid_t st_uid;        // 所有者用户识别号   
        gid_t st_gid;        // 组识别号   
        off_t st_size;       // 以字节为单位的文件容量   
        time_t st_atime;     // 最后一次访问该文件的时间   
        time_t st_mtime;     // 最后一次修改该文件的时间   
        time_t st_ctime;     // 最后一次改变该文件状态的时间   
        blksize_t st_blksize;// 文件内容所占的磁盘块的大小   
        blkcnt_t st_blocks;  // 文件内容所占的磁盘块的数量  
    };

    # 相关函数:

  • chdir()

    用途: int chdir(const char * path)

    切换到参数指定的目录,成功返回 0 , 失败返回 - 1 , 置 errno

  • getcwd()

    #include <unistd.h>
    char *getcwd(char *buf, size_t size);

    用途:将当前目录的绝对路径拷贝到参数 buffer 所指的空间,参数 sizebuf 所指的空间大小。 bu f 为 NULLsize 为 0 时, getcwd 调用 malloc 来动态分配内存一个空间存储绝对路径,返回指向这个空间的指针,此时要注意后面释放 buf 内存,防止内存泄漏。成功返回指向绝对路径的指针,失败返回 NULL ,置 errno

  • mkdir()

    #include <sys/types.h> 
    #include <sys/stat.h>
    int mkdir(const char *pathname, mode_t mode)

    用途:在当前目录下按照 mode 指定的权限创建名为 pathname 的目录,成功返回 0,失败返回 - 1,置 errno

    mode 简述(不全):使用掩码,后三位数字从左往右依次表示文件所有者权限、用户组权限、其他用户权限。1:只执行,2:只写入,4:只可读,7:读、写、执行,3:执行 + 写,5:读 + 执行,依次类推。可以只写后三位数字。

  • rmdir()

    #include <unistd.h>
    int rmdir(const char *pathname)

    用途:在当前目录下删除名为 pathname 的空目录,成功返回 0,失败返回 - 1,置 errno

  • opendir()

    #include <sys/types.h>
    #include <dirent.h>
    DIR *opendir(const char *name);
    DIR *fdopendir(int fd);

    用途:打开参数 name 或 fd 指定的目录,创建一个目录流。成功返回一个 DIR 指针,失败返回 NULL ,置 errno

  • readdir()

    include <dirent.h>
    struct dirent*readdir(DIR *dirp)

    用途:读取参数 dirp 指定的目录流,成功返回指向目录内当前偏移量指向的文件的简略信息的 dirent 结构指针,失败或者到达目录尾则返回 NULL

  • closedir()

    #include <sys/types.h>
    #include <dirent.h>
    int closedir(DIR *dirp);

    用途:关闭参数 dirp 指定的目录流,成功返回 0,失败返回 - 1,置 ereno

  • stat() fstat() lstat()

    #include <sys/stat.h>  
    #include <unistd.h>
    int stat(const char *path, struct stat *struct_stat);
    int lstat(const char *path,struct stat *struct_stat);
    int fstat(int fdp, struct stat *struct_stat);

    用途:通过文件名 path 或者文件描述符 fdp 获取文件详细信息,将信息保存在 struct_stat 结构体中,成功返回 0, 失败返回 - 1 并,置 errno。

    区别:stat 没有处理字符链接 (软链接)的能力,如果一个文件是符号链接 (软链接),stat 会直接返回它所指向的文件的属性;而 lstat 返回的就是这个符号链接的内容。目录在 linux 中也是一个文件,文件的内容就是这这个目录下面所有文件与 inode 的对应关系。硬链接就是在某一个目录下面将一个文件名与一个 inode 关联起来,就是添加一条记录。软链接也叫符号链接,这个文件的内容就是一个字符串,这个字符串就是它所链接的文件的绝对或者相对地址。

阅读次数