美文网首页
文件IO相关api

文件IO相关api

作者: 二进制人类 | 来源:发表于2022-09-26 09:38 被阅读0次

文件IO

系统默认分配的3个描述符

#define STDIN_FILENO 0      /* 标准输入文件描述符 */
#define STDOUT_FILENO 1     /* 标准输出文件描述符 */
#define STDERR_FILENO 2     /* 标准错误输出文件描述符 */

相关API

/* 头文件 */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* 函数原型 */
int open(const char *pathname, int flags);               /* 打开已经存在的文件 */
int creat(const char *pathname, mode_t mode);            /* 创建新的文件 */

/**
 * [open 打开已经存在的文件]
 * @param  pathname [需要打开或者创建文件的路径名称(可以是相对路径,也可以是绝对路径)]
 * @param  flags    [
 * 打开文件的方式
 *    1) 必须包含且仅包含其中一个:
            O_RDONLY:    只读
            O_WRONLY:    只写
            O_RDWR:      可读写
        2) 可选择宏定义:
            O_CREAT:    创建文件标志
            (1) O_CREAT 文件不存在则创建文件并打开,文件存在则直接打开文件;
            (2) O_CREAT | O_EXCL 文件不存在则创建文件并打开,文件存在则报错。
            (3) O_CREAT | O_TRUNC 文件不存在则创建文件并打开,文件存在直接打开文件并将原文件中内容清空。
            (4) O_CREAT | O_APPEND 文件不存在则创建文件并打开,文件存在则直接打开文件并将写指针移动到文件末尾(追加)。
            O_NONBLOCK:打开文件将其设置为非阻塞模式,在默认情况下如果没有使用O_NONBLOCK则为阻塞模式。
            O_NOCTTY:表示以非终端模式打开文件(一般指的是串口文件的打开)  
 * ]
 * @param  mode     [mode用来设置文件的权限(只有在创建文件的时候才有效,并且文件的权限 = mode & ~umask)]
 * @return          [成功返回文件描述符;
    失败返回-1,且修改errno的值(perror输出错误消息);  ]
 */
int open(const char *pathname, int flags, mode_t mode);  

#include <unistd.h>
/**
 * [close 关闭文件]
 * @param  fd [需要关闭的文件描述符]
 * @return    [成功返回文件描述符;
    失败返回-1,且修改errno的值(perror输出错误消息)]
 */
int close(int fd);
#include <unistd.h>
/**
 * [read 读文件数据]
 * @param  fd    [文件描述符]
 * @param  buf   [指向的空间用来存储读取到的数据]
 * @param  count [表示期望读取数据的字节数;
        count为0,返回0表示没有读取数据;
        count>SSIZE_MAX,则按照SSIZE_MAX读取;]
 * @return       [
 *  成功读取数据的字节数,
    返回0表示没有数据可读,表示结束;
    返回-1,表示读取数据失败
    ]
 */
ssize_t read(int fd, void *buf, size_t count);
#include <unistd.h>
/**
 * [write 写文件]
 * @param  fd    [文件描述符]
 * @param  buf   [指向的是需要写入文件的数据]
 * @param  count [期望写入文件数据字节数]
 * @return       [成功返回写入文件字节数,失败返回-1,且修改errno的值]
 */
ssize_t write(int fd, const void *buf, size_t count);
#include <sys/types.h>
#include <unistd.h>
/**
 * [lseek 文件指针定位]
 * @param  fd     [文件描述符]
 * @param  offset [表示的是偏移量,如果为负数向前偏移,正数向后偏移]
 * @param  whence [偏移基准 SEEK_SET起始位置 SEEK_CUR文件的当前位置 SEEK_END文件的结束位置]
 * @return        [成功返回是起始位置到偏移后的当前的位置;失败返回(off_t)-1且修改errno的值]
 */
off_t lseek(int fd, off_t offset, int whence);
#include <unistd.h>
#include <fcntl.h>
/**
 * [fcntl 控制已经打开文件的阻塞和非阻塞模式]
 * @param fd          [文件描述符]
 * @param cmd         [
 * cmd表示的是文件的控制命令,决定对文件的操作方式。
 *    fcntl函数有5种功能:
            1) 复制一个现有的描述符(cmd=F_DUPFD)
            2) 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
            3) 获得/设置文件状态标记(cmd=F_GETFL(void))或F_SETFL(int)))
            4) 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
            5) 获得/设置记录锁(cmd=F_GETLK, F_SETLK或F_SETLKW)

    @param ... arg是由参数2来决定类型,可能void或者int类型         
 * ]
 */
int fcntl(int fd, int cmd, ... /* arg */ );
/* 将fd文件描述符指向的文件设置为非阻塞模式 */
/* 1. 获取文件的状态 */
flags = fcntl(fd, F_GETFL);
if (flags == -1) {
perror("fcntl->F_GETFL");
return -1;
}
/* 设置文件的状态为非阻塞态 */
ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
if (ret == -1) {
perror("fcntl->F_SETFL");
return -1;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
/**
 * [stat 获取文件属性]
 * @param  pathname [需要获取文件属性的文件名称(绝对路径和相对路径)]
 * @param  buf      [
 结构体指针用来返回文件的属性
  struct stat {
               dev_t     st_dev;         / ID of device containing file /
               ino_t     st_ino;         / inode number /
               mode_t    st_mode;        / protection /
               nlink_t   st_nlink;       / number of hard links /
               uid_t     st_uid;         / user ID of owner /
               gid_t     st_gid;         / group ID of owner /
               dev_t     st_rdev;        / device ID (if special file) /
               off_t     st_size;        / total size, in bytes /
               blksize_t st_blksize;     / blocksize for filesystem I/O /
               blkcnt_t  st_blocks;      / number of 512B blocks allocated /

                Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. 

               struct timespec st_atim;  / time of last access /
               struct timespec st_mtim;  / time of last modification /
               struct timespec st_ctim;  / time of last status change /

           #define st_atime st_atim.tv_sec      / Backward compatibility /
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           }; 
 ]
 * @return          [成功返回0失败返回-1且修改errno的值]
 */
int stat(const char *pathname, struct stat *buf);
/*fstat函数功能,检测已经打开文件的属性,类似于stat。*/
int fstat(int fd, struct stat *buf);
/*lstat函数功能和stat函数类似,但是区别stat不能检测符号链接文件类型,lstat可以检测符号链接文件类型*/    
int lstat(const char *pathname, struct stat *buf);    
#include <sys/types.h>
#include <pwd.h>

/**
 * [getpwuid 解析用户名称]
 * @param  uid [用户id号,使用stat函数返回结构体中st_uid成员]
 * @return     [ 
 * 成功返回用户结构指针,失败返回NULL
 * struct passwd {
               char   *pw_name;       / username /
               char   *pw_passwd;     / user password /
               uid_t   pw_uid;        / user ID /
               gid_t   pw_gid;        / group ID /
               char   *pw_gecos;      / user information /
               char   *pw_dir;        / home directory /
               char   *pw_shell;      / shell program /
           };
 * ]
 */
struct passwd *getpwuid(uid_t uid);
#include <sys/types.h>
#include <grp.h>
/**
 * [getgrgid 解析用户组名称]
 * @param  gid [用户组id号,使用stat函数返回结构体中st_gid成员]
 * @return     [
 * 成功返回组结构指针,失败返回NULL
 * struct group {
               char   *gr_name;        / group name /
               char   *gr_passwd;      / group password /
               gid_t   gr_gid;         / group ID /
               char  **gr_mem;         / NULL-terminated array of pointers
                                          to names of group members /
           };
 * ]
 */
struct group *getgrgid(gid_t gid);
#include <unistd.h>
/**
 * [readlink 解析符号链接文件的链接文件]
 * @param  pathname [文件路径]
 * @param  buf      [存储内容]
 * @param  bufsiz   [长度]
 * @return          [成功返回字符数 失败返回-1修改errno]
 */
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
#include <sys/types.h>
#include <dirent.h>
/**
 * [opendir 打开目录]
 * @param  name [文件路径]
 * @return      [成功返回目录流指针,失败返回NULL且修改errno的值]
 */
DIR *opendir(const char *name);
/**
 * [fdopendir 打开目录]
 * @param  fd [文件描述符]
 * @return    [成功返回目录流指针,失败返回NULL且修改errno的值]
 */
DIR *fdopendir(int fd);
#include <dirent.h>
/**
 * [readdir 读目录]
 * @param  dirp [目录流指针]
 * @return      [
 * 成功返回dirent结构体指针,失败和结束返回NULL
 *  struct dirent {
               ino_t          d_ino;       / 索引节点号 /
               off_t          d_off;       / 在目录文件中的偏移 /
               unsigned short d_reclen;    / 文件名长度 /
               unsigned char  d_type;      / 目录类型 /
               char           d_name[256]; / 目录名 /
           };
 * ]
 */
struct dirent *readdir(DIR *dirp);
#include <sys/types.h>
#include <dirent.h>
/**
 * [closedir 关闭目录]
 * @param  dirp [目录指针]
 * @return      [成功返回0,失败返回-1且修改errno的值]
 */
int closedir(DIR *dirp);

相关文章

  • 文件IO相关api

    文件IO 系统默认分配的3个描述符 相关API

  • gradle(6)-file相关api

    文件相关api包括: 路径获取相关api 和文件操作相关api,文件操作api只使用于工程的目录下操作.跨工程不能...

  • html5plusAPP的填坑之路

    1、io操作调用plus.io.resolveLocalFileSystemURL的api根据文件路径读取文件,填...

  • 文件相关API

    复制文件/文件夹, 可以改名字,以及排除某些文件

  • Gradle-操作文件&文件拷贝

    # 任务 了解 Project 中操作文件的相关 API; 代码演示-文件路径相关API; 代码演示-file(p...

  • Java—IO

    Java—IO流 1.IO—File常用API及文件编码 separator:名称分隔符,用来拼接文件路径path...

  • 11.标准IO库

    标准IO和文件IO有什么区别 看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是linux系统的API ...

  • 2.3 读写文本文件

    java的文件操作(IO操作)是由一组相关的Api(接口、抽象类、实现类)组成的。本节我们介绍最常见的文本文件的读...

  • iOS 字符串路径相关Api

    截取文件路径相关的 Api

  • Storage-file-CRUD

    存储下文件的文件相关API声明 1.list文件 (GET /api/v0/storage/{id}/files;...

网友评论

      本文标题:文件IO相关api

      本文链接:https://www.haomeiwen.com/subject/ixsxartx.html