代码编织梦想

文件同步:

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;   // 设备ID
    ino_t     st_ino;   // i节点号
    mode_t    st_mode;  // 文件的类型和权限
    nlink_t   st_nlink; // 硬链接数
    uid_t     st_uid;   // 用户ID
    gid_t     st_gid;   // 组ID
    dev_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_mode  
        S_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   设置用户ID
    S_ISGID    0002000   设置组ID
    S_ISVTX    0001000   sticky bit (see below)
    S_IRWXU    00700     用户权限掩码
    S_IRUSR    00400     
    S_IWUSR    00200     
    S_IXUSR    00100     
    S_IRWXG    00070     组权限掩码
    S_IRGRP    00040     
    S_IWGRP    00020     
    S_IXGRP    00010     
    S_IRWXO    00007     其他用户权限掩码
    S_IROTH    00004     
    S_IWOTH    00002     
    S_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_UNKNOWN
    	DT_FIFO = 1,        //管道
	# define DT_FIFO DT_FIFO
    	DT_CHR = 2,         //字符设备文件
	# define DT_CHR  DT_CHR
   	 DT_DIR = 4,         //目录
	# define DT_DIR  DT_DIR
	    DT_BLK = 6,         //块设备文件
	# define DT_BLK  DT_BLK
	    DT_REG = 8,         //普通文件
	# define DT_REG  DT_REG
	    DT_LNK = 10,        //连接文件
	# define DT_vimLNK  DT_LNK
	    DT_SOCK = 12,       //套接字类型
	# define DT_SOCK DT_SOCK
	    DT_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);
功能:获取目录流的位置指针

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_43038236/article/details/108228595