文件同步:
1、在写入数据时内存与磁盘之间也有一个缓冲区,这种机制降低了磁盘读写次数,提高了读写的效率。
2、但这种机制带来的后果就是磁盘中的数据与实写入的数据不匹配,系统提供了一个函数可以让缓冲区中的数据立即写入到磁盘。
void sync(void);
功能:把缓冲区中的数据同步到磁盘
注意:并不等到数据同步完成后才返回,而是把缓冲区的数据加入到写入队列。
int fsync(int fd);
功能:把指定文件的内容从缓冲区同步到磁盘
注意:会等到完全定稿磁盘才返回
int fdatasync(int fd);
功能:把指定文件的内容从缓冲区同步到磁盘,只同步文件的内容不同步属性。
文件属性:
int stat(const char *path, struct stat *buf);
功能:根据文件的路径获取文件的属性
buf:存储文件属性的结构休指针,是个输出型参数。
int fstat(int fd, struct stat *buf);
功能:根据文件描述符获取文件的属性
int lstat(const char *path, struct stat *buf);
功能:获取软链接文件的文件属性。
struct stat {dev_t st_dev; // 设备IDino_t st_ino; // i节点号mode_t st_mode; // 文件的类型和权限nlink_t st_nlink; // 硬链接数uid_t st_uid; // 用户IDgid_t st_gid; // 组IDdev_t st_rdev; // 特殊设备ID号off_t st_size; // 总字节数blksize_t st_blksize; // IO块字节数blkcnt_t st_blocks; // 占用512字节块数time_t st_atime; // 最后访问时间time_t st_mtime; // 最后内容修改时间time_t st_ctime; // 最后状态修改时间,tm结构体,localtime()函数st_modeS_ISREG(m) 普通文件S_ISDIR(m) 目录文件S_ISCHR(m) 字符设备文件S_ISBLK(m) 块设备文件S_ISFIFO(m) 管道文件S_ISLNK(m) 软链接文件S_ISSOCK(m) socket文件S_IFMT 0170000 获取文件类型的掩码S_IFSOCK 0140000 socket文件S_IFLNK 0120000 软链接文件S_IFREG 0100000 普通文件S_IFBLK 0060000 块设备文件S_IFDIR 0040000 目录文件S_IFCHR 0020000 字符设备文件S_IFIFO 0010000 管道文件S_ISUID 0004000 设置用户IDS_ISGID 0002000 设置组IDS_ISVTX 0001000 sticky bit (see below)S_IRWXU 00700 用户权限掩码S_IRUSR 00400S_IWUSR 00200S_IXUSR 00100S_IRWXG 00070 组权限掩码S_IRGRP 00040S_IWGRP 00020S_IXGRP 00010S_IRWXO 00007 其他用户权限掩码S_IROTH 00004S_IWOTH 00002S_IXOTH 00001
文件的权限:
int access(const char *pathname, int mode);
功能:测试当前用户对文件的权限
pathname:文件的路径
mode:想测试的权限
返回值:存在返回0,不存在返回-1。
F_OK 文件是否存在
W_OK 写权限
R_OK 读权限
X_OK 执行权限
int chmod(const char *path, mode_t mode);
功能:根据文件的路径修改文件权限
path:文件的路径
mode:由三个8进行组成的权限码
0644 普通文件
0755 可执行文件
int fchmod(int fd, mode_t mode);
功能:根据文件描述符修改文件的权限
fd:文件描述符
mode_t umask(mode_t mask);
功能:设置当前进程的权限屏蔽码
mask:想要设置的权限屏蔽码
返回值:旧的权限屏幕码
注意:权限屏蔽码默认是当前终端的,该函数的设置只对当前进程有效,进行结束后就失效了。
权限屏蔽码:
如果我们不让新创建的文件具有某些权限,可以设置权限过滤,记录在权限屏蔽码中。
权限屏蔽码对于chmod命令和函数是无效。
修改文件的大小
int truncate(const char *path, off_t length);
功能:根据文件路径修改文件的大小
length:想要修改的的字节数
int ftruncate(int fd, off_t length);
功能:根据文件描述符修改文件的大小
length:想要修改的的字节数
删除和重命名:
int remove(const char *pathname);
功能:标准库中删除文件函数,底层调用的是unlink
int unlink(const char *pathname);
功能:删除硬链接文件
int rename(const char *oldpath, const char *newpath);
链接文件:
int link(const char *oldpath, const char *newpath);
功能:创建硬链接文件
int symlink(const char *oldpath, const char *newpath);
功能:创建软件链接文件
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
功能:只读取软链接文件本身,而非链接目标,读取的内容就是链接目录的路径
目录操作:
int mkdir(const char *pathname, mode_t mode);
功能:创建目录
mode:目录的权限,注意必须要有执行权限,否则无法进入
int rmdir(const char *pathname);
功能:删除空目录
注意:linux没有办法直接删除非空目录,想要做到只能先清空非空目录,再删除当前目录
int chdir(const char *path);
功能:进入目录,相当于cd命令
char *getcwd(char *buf, size_t size);
功能:获取当前目录,相当于pwd命令
struct dirent readdir(DIR)
功能:获取指定目录内容
DIR *opendir(const char *name);
功能:打开文件文件,返回一个目录流
#include<dirent.h>struct dirent *readdir(DIR *dirp);功能:从目录流中读取一条记录struct dirent {ino_t d_ino; // i节点编号off_t d_off; // 下一个条目的偏移量unsigned short d_reclen; // 当前条目的长度unsigned char d_type; // 文件类型DT_BLK 块设备文件DT_CHR 字符设备文件DT_DIR 目录文件DT_FIFO 管道文件DT_LNK 软链接文件DT_REG 普通文件DT_SOCK socket文件DT_UNKNOWN 未知 类型char d_name[256]; // 文件名/* 补充DT_UNKNOWN = 0, //未知类型# define DT_UNKNOWN DT_UNKNOWNDT_FIFO = 1, //管道# define DT_FIFO DT_FIFODT_CHR = 2, //字符设备文件# define DT_CHR DT_CHRDT_DIR = 4, //目录# define DT_DIR DT_DIRDT_BLK = 6, //块设备文件# define DT_BLK DT_BLKDT_REG = 8, //普通文件# define DT_REG DT_REGDT_LNK = 10, //连接文件# define DT_vimLNK DT_LNKDT_SOCK = 12, //套接字类型# define DT_SOCK DT_SOCKDT_WHT = 14 //# define DT_WHT DT_WHT};*/
int closedir(DIR *dirp);功能:关闭目录流void seekdir(DIR *dirp, long offset);功能:设置目录流的位置指针,用于随机读取void rewinddir(DIR *dirp);功能:设置目录流的位置指针到开头long telldir(DIR *dirp);功能:获取目录流的位置指针