# 目录 / 文件相关
# 存储信息的结构体:
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
所指的空间,参数size
为buf
所指的空间大小。bu
f 为NULL
,size
为 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 关联起来,就是添加一条记录。软链接也叫符号链接,这个文件的内容就是一个字符串,这个字符串就是它所链接的文件的绝对或者相对地址。