Linux系统编程 - 文件操作函数整理
stat 函数
获取文件属性,(从 inode 结构体中获取)
int stat(const char *path, struct stat *buf);
成功返回 0;失败返回-1 设置 errno 为恰当值。
参数 1:文件名
参数 2:inode 结构体指针 (传出参数)
文件属性将通过传出参数返回给调用者。
lstat 函数
获取文件属性,(从 inode 结构体中获取)
int lstat(const char *path, struct stat *buf);
成功返回 0;失败返回-1 设置 errno 为恰当值。
【get_file_type.c】
文件类型判断方法:st_mode 取高 4 位。 但应使用宏函数:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
穿透符号链接:stat:会;lstat:不会
truncate 函数
截断文件长度成指定长度。常用来拓展文件大小,代替 lseek。
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
成功:0;失败:-1 设置 errno 为相应值
link 函数
为已经存在的文件创建目录项(硬链接)
int link(const char *oldpath, const char *newpath);
成功:0;失败:-1 设置 errno 为相应值。
注意:由于两个参数可以使用“相对/绝对路径+文件名”的方式来指定,所以易出错。
unlink 函数
删除一个文件的目录项;
int unlink(const char *pathname);
成功:0;失败:-1 设置 errno 为相应值
注意 Linux 下删除文件的机制:不断将 st_nlink -1,直至减到 0 为止。无目录项对应的文件,将会被操作系统择机释放。(具体时间由系统内部调度算法决定)因此,我们删除文件,从某种意义上说,只是让文件具备了被释放的条件。
unlink 函数的特征:清除文件时,如果文件的硬链接数到 0 了,没有 dentry 对应,但该文件仍不会马上被释放。要等到所有打开该文件的进程关闭该文件,系统才会挑时间将该文件释放掉。
getcwd 函数
获取进程当前工作目录 (卷 3,标库函数)
char *getcwd(char *buf, size_t size);
成功:buf 中保存当前进程工作目录位置。失败返回 NULL。
chdir 函数
改变当前进程的工作目录
int chdir(const char *path);
成功:0;失败:-1 设置 errno 为相应值
opendir 函数
根据传入的目录名打开一个目录 (库函数) DIR * 类似于 FILE *
DIR *opendir(const char *name); 成功返回指向该目录结构体指针,失败返回 NULL
参数支持相对路径、绝对路径两种方式
closedir 函数
关闭打开的目录
int closedir(DIR *dirp);
成功:0;失败:-1 设置 errno 为相应值
readdir 函数
读取目录 (库函数)
struct dirent *readdir(DIR *dirp);
成功返回目录项结构体指针;失败返回NULL设置errno为相应值
需注意返回值,读取数据结束时也返回 NULL 值,所以应借助 errno 进一步加以区分
struct 结构体:
struct dirent {
ino_t d_ino; inode 编号
off_t d_off;
unsigned short d_reclen; 文件名有效长度
unsigned char d_type; 类型(vim 打开看到的类似@*/等)
char d_name[256];文件名
};
其成员变量重点记忆两个:d_ino、d_name。实际应用中只使用到 d_name。
dup 函数
功能:文件描述符拷贝。
int dup(int oldfd);
成功:返回一个新文件描述符;失败:-1 设置 errno 为相应值
使用现有的文件描述符,拷贝生成一个新的文件描述符,且函数调用前后这个两个文件
描述符指向同一文件。
dup2 函数
功能:文件描述符拷贝。重定向文件描述符指向。
int dup2(int oldfd, int newfd);
通过该函数可实现命令行“重定向”功能。使得原来指向某文件的文件描述符,指向其他指定文件。
成功:返回一个新文件描述符;
如果 oldfd 有效,则返回的文件描述符与 oldfd 指向同一文件。
失败:如果 oldfd 无效,调用失败,关闭 newfd。返回-1,同时设置 errno 为相应值。