目录
1, stat,fstat,lstat 用来获取文件的属性信息
一,目录操作的相关API
1,创建或删除一个空目录
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);
@pathname: 要创建的目录的路径
@mode : 指定目录的权限,用八进制表示 0777
成功返回0,失败返回-1
rmdir 只能删除一个空目录
int rmdir(const char *pathname);
2,打开目录
#include<sys/types.h>
#include<dirent.h>
opendir和fdopendir都是用来打开一个目录,只不过opendir是用路径名来指定目录,而fdopendir是用文件描述符来指定目录。
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
如果成功返回一个DIR的指针,在Unix/Linux下面,目录用DIR结构体来维护的。
失败返回NULL,errno被设置
3,读一个目录
#include <dirent.h>
readdir用来从dirp指定的目录中,读取其中的目录项(struct dirent)并返回。
目录文件就是一个目录项数组,里面保存的是文件的i-node编号
struct dirent *readdir(DIR *dirp);
@dirp: 表示要读哪一个打开的目录
返回值: 如果成功返回一个目录项(struct dirent指针),遍历该数组的下标加一。下次再调用readdir 读同一个目录,则返回下一个目录项。如果读完了或者出错了,则返回NULL。
struct dirent {
ino_t d_ino; //该文件的i-node编号
off_t d_off; //偏移量,即数组的下标
unsigned short d_reclen; //这条结构体的长度
unsigned char d_type; //该目录项对象的文件的类型
(有些文件系统不支持)
char d_name[256]; //文件的名字(不带路径)
};
NOTE: 只有d_ino和d_name这两个成员变量是被所有的系统支持的。
4,关闭一个目录
int closedir(DIR *dirp);
二,获取文件的属性信息
1, stat,fstat,lstat 用来获取文件的属性信息
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
stat 用来把pathname指定的文件(包含目录,普通文件,设备文件)的状态及属性信息
保存到statbuf指向的结构体变量中去。
fstat与stat的功能类似,只不过该函数使用文件描述符来指定文件。
lstat与stat的功能类似,只不过pathname指定的文件如果是符号链接时,lstat获取的是符号链接文件本身的属性,而stat获取的是链接文件指向的文件的属性。
int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
返回值:
成功,返回0
失败,返回-1,errrno被设置
在linux/Unix中文件的属性信息,用结构体struct stat来表示的,其内容为:
struct stat {
dev_t st_dev; //dev_t设备号类型,容纳该文件的那个设备的设备号
ino_t st_ino; //inode number
mode_t st_mode; //文件的权限(包含类型)
nlink_t st_nlink;//Inode的硬链接数
uid_t st_uid; //文件的属主的用户ID
gid_t st_gid; //文件属主的组ID
dev_t st_rdev; //设备号(如果该文件时候是设备文件)
off_t st_size; //文件内容的长度(字节)
//st_size对普通文件(文本文件、二进制文件)指文件内容长度
//st_size对目录而言,文件长度通常是一个数的倍数
//st_size对符号链接文件,符号链接文件的内容是指向文件的名字
blksize_t st_blksize; //block size 块大小 (与具体的硬件有关)
blkcnt_t st_blocks; //文件占多少块(在linux下面每个块是512字节)
struct timespec st_atim; //最近访问"文件内容"的时间
struct timespec st_mtim; //最近修改"文件内容"的时间
struct timespec st_ctim; //最近改变"文件属性"的时间
};
其中 st_mode 包含了文件的类型与权限,我们可以用下列的宏来解析
S_ISREG(st.st_mode) 为真,表示为普通文件(regular file) -
S_ISDIR(st.st_mode) 为真,表示为目录文件(directory) d
S_ISCHR(st.st_mode) 为真,表示为字符设备文件(char) c
S_ISBLK(st.st_mode) 为真,表示为块设备文件(block) b
S_ISFIFO(st.st_mode) 为真,表示为管道文件(pipi) p
S_ISLNK(st.st_mode) 为真,表示为符号链接文件(link) l
S_ISSOCK(st.st_mode) 为真,表示为套接字文件(socket) s
判断文件的权限位,我们可以用下列的宏来解析
S_IRUSR S_IWUSR S_IXUSR
S_IRGRP S_IWGRP S_IXGRP
S_IROTH S_IWOTH S_IXOTH
if(st.st_mode & S_IRUSR)
{
//该文件对用户有读的权限
}
2,access
#include <unistd.h>
access用来测试调用进程是否有相应的权限去访问pathname指定的文件
int access(const char *pathname, int mode);
@pathname: 要测试的文件的路径名
@mode: 要测试的访问权限,按位或测试多个权限
R_OK: 测试读的权限
W_OK: 测试写的权限
X_OK: 测试执行的权限
F_OK: 测试文件是否存在
返回值:
0 所有测试的权限都OK
-1 至少有一项测试权限不OK
3,umask
3,umask 用来指定文件的权限掩码位
umask中为1的权限位,你会创建文件时,不能指定,我们称为安全权限。
比如在根目录下写的权限会被掩盖掉。最后效果为 与上掩码的取反。
mode_t umask(mode_t mask);
4,chmod/fchmod
用来改变文件的权限位
chmod/fchmod 用来改变文件的权限位,只不过chmod用pathname字符串指定文件名,
fchmod用文件描述符来指定文件名。
int chmod(const char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);
5,truncate/ftruncate
truncate/ftruncate用来把文件截短到指定的长度
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
注意: 把一个文件截短首先需要有写的权限
6,getcwd
getcwd用来获取当前的工作路径(绝对路径),保存到buf指向的字符数组,数组大小为size
char *getcwd(char *buf, size_t size);
7,chdir
chdir用来把当前路径修改为path指定的路径(实质上是把进程的PWD环境变量进行修改)
int chdir(const char *path);
8, remove/unlink
用来删除一个文件或目录
remove用来删除一个文件或者一个空目录
int remove(const char *pathname);
unlink用来删除一个文件
int unlink(const char *pathname);
9,system
用来执行一个程序或者命令
#include <stdlib.h>
int system(const char *command);