• UNIX下的文件操作


    一、lseek
      1、每一个打开的文件都一个与之相关的"文件位置"。
      2、文件位置通常情况是一个非负整数,用来度量文件从开始到结束的字节数。
      3、文件的读写操作都是从当前的文件位置开始的,根据所读写的字节数移动文件的位置。
      4、当使用open打开文件时除非设置O_APPEND参数,否则文件位置一律在开头。
      5、使用fseek/lseek仅是将文件位置记录在内核中,并不引发任何I/O操作。
      6、如果越过文件末尾位置写入数据,将在文件中形成黑洞,它不占用磁盘空间,但计算在文件大小内。

      off_t lseek(int fd, off_t offset, int whence);
      功能:调用文件的位置
      fd:文件描述符
      offset:偏移值
      whence:基准点
      SEEK_SET 开头位置
      SEEK_CUR 当前位置
      SEEK_END 末尾位置
      返回值:当前文件位置

    二、文件描述符的复制
      int dup(int oldfd);
      功能:复制文件描述符
      oldfd:被复制的文件描述符
      返回值:新复制出的文件描述符(操作系统随机分配的),失败返回-1。


      int dup2(int oldfd, int newfd);
      功能:复制文件描述符
      oldfd:被复制的文件描述符
      newfd:指定新复制出的文件描述符,如果newfd已经打开,则先关闭再复制。
      返回值:新复制出的文件描述符(操作系统随机分配的),失败返回-1。

    三、文件同步
      1、大多数磁盘进入读写时都会有缓冲机制,当我们写入文件时其实是写入到了缓冲区里并没有写到磁盘中,直到缓冲区满才排队写入到磁盘中。
      2、这样做的处是降低了写操作的次数,提高程序的运行效率,但也造成了磁盘与文件的内容不同步,这样可能会造成A程序数据已经写入,但B程序读不到。
      3、sync/fsync/fdatasync用于强制把缓冲区的内容同步到磁盘中。

      void sync(void);
      功能:把所以有修改过的文件同步到磁盘中,所以待同步文件会排队把数据同步的磁盘,而sync不会等到所有文件同步完成后才回,而是立即返回。

      int fsync(int fd);
      功能:指定某个文件的内容同步到磁盘,同步完成后才返回。

      int fdatasync(int fd);
      功能:指定某个文件的内容同步到磁盘,同步完成后才返回,但只同步文件的数据,不同步文件的属性。

    四、获取文件的属性
      int stat(const char *path, struct stat *buf);
      功能:根据文件的路径,获取文件的属性

      int fstat(int fd, struct stat *buf);
      功能:根据文件描述符,获取文件的属性

      int lstat(const char *path, struct stat *buf);
      功能:根据文件的路径,获取软链接文件的属性。

      注意:stat会跟踪获取软链接的目标文件属性,而lstat只获取软链接文件的。

      文件属性结构体struct stat:
      dev_t st_dev; // 设备号
      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; // 最后属性修改时间


      时间转换:
      struct tm *localtime(const time_t *timep);
      功能:把time_t类型的时间转换成时间结构体
      struct tm 结构体:
      int tm_sec; /* seconds */
      int tm_min; /* minutes */
      int tm_hour; /* hours */
      int tm_mday; /* day of the month */
      int tm_mon; /* month */
      int tm_year; /* year */
      int tm_wday; /* day of the week */
      int tm_yday; /* day in the year */
      int tm_isdst;

    五、权限屏蔽码
      当使用open/creat创建文件时,所设置的文件权限会减掉权限屏幕码所设置的权限。
      如何查看权限屏幕码:
      1、命令:umask
      2、函数:mode_t umask(mode_t mask);
      功能:修改权限屏蔽码
      返回值:修改成功后的权限屏蔽码
      注意:只是针对当前进程,而不会修改系统的权限屏蔽码

    六、修改文件权限
      int chmod(const char *path, mode_t mode);
      功能:根据文件的路径修改文件的权限

      int fchmod(int fd, mode_t mode);
      功能:根据文件描述符修改文件的权限

    七、修改文件的属主和属组
      int chown(const char *path, uid_t owner, gid_t group);
      功能:根据文件的路径修改文件的属主和属组

      int fchown(int fd, uid_t owner, gid_t group);
      功能:根据文件描述符修改文件的属主和属组

      int lchown(const char *path, uid_t owner, gid_t group);
      功能:根据文件的路径修改文件的属主和属组,只针对链接文件修改

      注意:普通用户没有修改的权限

    八、修改文件的大小
      int truncate(const char *path, off_t length);
      功能:根据文件路径,修改文件的大小,多余的部分截取掉。

      int ftruncate(int fd, off_t length);
      功能:根据文件描述符,修改文件的大小,多余的部分截取掉。

      注意:如果要修改后大小超出文件原本的大小,就会形成黑洞。

    九、创建删除硬链接文件
      int link(const char *oldpath, const char *newpath);
      功能:创建硬链接文件
      oldpath:被链接的文件路径
      newpath:链接文件的路径

      int unlink(const char *pathname);
      功能:删除链接文件

      int remove(const char *pathname);
      功能:根据文件路径删除文件

      int rename(const char *oldpath, const char *new‐path);
      功能:为文件重命名

      注意:普通文件就一种链接数量只有一个的硬链接文件,所以unlink也能用来删除普通文件。

    十、软件链接文件的创建
      硬链接文件就一个文件名,是目录文件中的一个条目,而软链接文件是一个独立的文件,里面记录的是被链接的路径。
      int symlink(const char *oldpath, const char *newpath);
      功能:创建软链接文件,链接目标可以不存在
      oldpath:被链接文件可以不存在,只要最终创建出来,链接文件就能正常访问
      newpath:软链接文件路径。

      ssize_t readlink(const char *path, char *buf,size_t bufsiz);
      功能:读取软链接文件的信息到buf中
      buf:数据的存储位置
      bufsiz:buf的大小
      返回值:成功读取到的字节数

    十、创建空目录/删除空目录
      int mkdir(const char *pathname, mode_t mode);
      功能:创建空目录
      pathname:路径
      mode:目录的权限

      int rmdir(const char *pathname);
      功能:删除空目录,只能删除目录。
      注意:操作系统没有提供删除非空目录的方法。

  • 相关阅读:
    设计模式课程 设计模式精讲 3-7 接口隔离原则讲解及Coding
    如果你的css文件这么分类,可维护性大大增强!--摘抄
    你如果知道这些css常用命名,绝对事半功倍!--摘抄
    前端开发 CSS中你所不知道的伪类与伪元素的区别--摘抄
    腾讯浏览服务
    CSS3动画那么强,requestAnimationFrame还有毛线用--摘抄
    浏览器的 16ms 渲染帧--摘抄
    了解Chrome扩展程序开发--摘抄
    HTML 文档之 Head 最佳实践--摘抄
    安卓版微信视频播放全屏处理--摘抄
  • 原文地址:https://www.cnblogs.com/xiwen2017/p/10599478.html
Copyright © 2020-2023  润新知