Linux环境编程(4)文件操作相关内容补充

    科技2022-08-30  112

    Linux环境编程(4)

    文件同步:

    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; // 最后状态修改时间 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:想要修改的的字节数 练习1:实现一个函数,可以删除文件的[n,m)个字节。 int del_file(const char* path ,size_t n,size_t m);

    删除和重命名:

    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); 功能:删除空目录 int chdir(const char *path); 功能:进入目录,相当于cd命令 char *getcwd(char *buf, size_t size); 功能:获取当前目录,相当于pwd命令 DIR *opendir(const char *name); 功能:打开文件文件,返回一个目录流 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]; // 文件名 int closedir(DIR *dirp); 功能:关闭目录流 void seekdir(DIR *dirp, long offset); 功能:设置目录流的位置指针,用于随机读取 void rewinddir(DIR *dirp); 功能:设置目录流的位置指针到开头 long telldir(DIR *dirp); 功能:获取目录流的位置指针

    Processed: 0.017, SQL: 9