1.标准C库API文件流操作跨平台1.1.fopen文件打开函数原型FlLE *fopen(const char *pathname,const char mode);功能打开指定路径的文件返回文件流指针FILE打开失败返回NULL并设置ermno。参数pathname文件路径相对路径如./test.txt绝对路径如home/test/test.txt。moder只读模式文件必须存在无法写入文件不存在则失败w只写模式文件不存在则创建存在则清空内容覆盖原有数据慎用a追加模式文件不存在则创建写入内容追加到文件未尾不覆盖原有数据适合日志写入r读写模式文件必须存在可同时读写不创建新文件w读写模式文件不存在则创建存在则清空覆盖原有数据可读写a读写模式文件不存在则创建写入追加到末尾读操作可从头开始写操作仅追加rbwb二进制只读/只写处理二进制文件如图片、可执行程序避免换行符转换返回值成功返回非NULL的FILE指针失败返回NULL并设置ermno可通过perror()打印错误信息1.2.fclose文件关闭函数原型int fclose(FILE*stream);功能关闭文件流释放缓冲区资源返回0表示成功非0表示失败。返回值成功返回0失败返回EOF-1并设置errno。注意文件打开后必须关闭否则会导致资源泄露、缓冲区数据丢失。关闭后stream指针失效不可再用于后续文件操作建议手动置为NULL。关闭失败通常是缓冲区同步失败如磁盘满需捕获错误。1.3.fread读取文件函数原型size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);功能从文件流stream中读取数据存入ptr指向的缓冲区。参数说明ptr接收数据的缓冲区指针。size每个数据块的字节大小。nmemb要读取的最大数据块数量。stream目标文件流指针。返回值实际成功读取的数据块数量不是字节数返回值nmemb读取成功已读取指定数量的数据块。返回值返回值0无数据可读文件末尾或读取失败。1.4.fwrite写入文件函数原型size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);功能将ptr缓冲区中的数据写入文件流stream。参数说明与fread一致ptr为待写入数据的缓冲区指针。返回值实际成功写入的数据块数量等于nmemb表示写入成功小于nmemb表示写入失败。1.5.fprintf格式化写入函数原型int fprintf(FILE *stream,const char *format,...);功能将格式化数据写入文件流stream而非终端支持%d、%s、%f等格式符。1.6.fscanf格式化读取函数原型int fscanf(FILE *stream,const char *format,...);功能从文件流stream中按格式读取数据存入指定变量。1.7.fseek设置文件指针位置函数原型int fseek(FILE *stream,long offset,int whence);功能移动文件流stream的读写指针到指定位置。参数说明offset偏移量字节数可正可负正表示向后移动负表示向前移动。whence偏移基准点SEEK_SET以文件开头为基准点。SEEK_CUR以当前文件指针位置为基准点。SEEK_END以文件末尾为基准点。返回值0表示成功非0表示失败。1.8.ftell获取当前文件指针位置函数原型long ftell(FILE *stream);功能获取文件流stream当前读写指针距离文件开头的字节数。返回值当前文件指针距离文件开头的字节数失败返回-1。1.9.rewind将文件指针重置到文件开头函数原型void rewind(FlLE *stream);功能等价于fseekstream0SEEK_SET将读写指针重置到文件开头无返回值。2.Linux系统调用API文件描述符操作底层高效2.1.open文件打开函数原型int open(const char *pathname,int flags);int open(const char *pathname,int flags,mode_t mode);功能打开/创建文件返回文件描述符非负整数失败返回-1并设置ermno。参数flags打开标志必选可通过|组合多个标志基础标志互斥只能选一个O_RDONLY只读模式。O_WRONLY只写模式。O_RDWR读写模式。附加标志可选O_CREAT文件不存在则创建必须配合mode参数设置文件权限。O_TRUNC文件存在则清空内容对应fopen的w模式。O_APPEND追加模式对应fopen的a模式。O_NONBLOCK非阻塞模式读写不阻塞适合异步操作。mode文件权限仅当O_CREAT时有效用8进制数表示如0644、07550644所有者可读可写642所属组/其他用户只读4。0755所有者可读可写可执行7421所属组/其他用户可读可执行541。返回值成功返回非负整数文件描述符通常从 3开始0/1/2分别为标准输入/输出/错误失败返回-1并设置ermo。2.2.close文件关闭函数原型int close(int fd);功能关闭文件描述符释放文件资源返回0表示成功-1表示失败。返回值成功返回0失败返回-1并设置errno。注意文件描述符是有限资源默认上限1024打开后必须关闭避免资源泄露。关闭后fd失效不可再用于后续文件操作建议手动置为-1。2.3.read读取文件函数原型ssize_t read(int fd,void *buf,size_t count);功能从文件描述符fd中读取最多count字节数据存入buf缓冲区。返回值实际读取的字节数0表示读取到文件末尾-1表示出错。2.4.write写入文件函数原型ssize_t write(int fd,const void *buf,size_t count);功能将buf缓冲区中最多count字节数据写入文件描述符fd。返回值实际写入的字节数-1表示出错。2.5.Iseek文件指针定位函数原型off_t lseek(int fd,off_t offset,int whence);功能与fseek类似移动文件描述符fd的读写指针实现随机读写。参数与fseek一致whence同样支持SEEK_SET/SEEK_CUR/SEEK_END。返回值移动后指针距离文件开头的字节数失败返回-1。2.6.chmod文件权限修改函数原型int chmod(const char *pathname,mode_t mode);功能修改文件/目录的权限mode为8进制数如0755。3.目录操作APILinux特有为主3.1.创建目录mkdir函数原型int mkdir(const char *pathname,mode_t mode);功能用于创建单个目录不支持递归创建多级目录对应Linux终端命令mkdir。参数pathname待创建目录的路径相对路径如./test_dir绝对路径如home/test/test_dirmode目录权限8进制数表示核心取值0755默认、0700规则与普通文件一致返回值成功返回0失败返回-1并设置ermo常见错误EExIST目录已存在、EACCES权限不足、ENOENT上级目录不存在。注意mkdir不支持递归创建如./a/b/c若a目录不存在则创建失败需手动逐级创建或调用第三方工具函数。3.2.删除目录rmdir函数原型int rmdir(const char *pathname);功能用于删除空目录非空目录删除失败对应Linux终端命令rmdir。参数pathname待删除目录的路径相对/绝对路径。返回值成功返回0失败返回-1并设置 ero常错误ENOTEMPTY目录非空、EACCES权限不足、ENOENT目录不存在注意若需删除非空目录需先遍历目录删除所有文件/子目录再调用rmdir删除空目录。3.3.打开目录opendir函数原型DIR *opendir(const char *name);功能打开指定目录返回目录流指针DIR参数name为目标目录的路径相对/绝对路径。返回值成功返回非NULL的DIR目录流指针失败返回 NULL并设置 ermo常见错误ENOENT目录不存在、EACCES权限不足。3.4.读取目录项readdir函数原型struct dirent readdir(DIRdirp);功能循环读取目录流中的单个目录项每次调用返回下一个目录项的信息直到目录末尾。参数dirpopendir返回的目录流指针。目录项结构体struct dirent{ ino_t d_ino; //文件索引号 off_t d_off; //目录项偏移量 unsigned short d_reclen; //该目录项大小 unsigned char d_type; //文件类型 char d_name[256]; //文件名 };返回值成功返回指向 studt drent的指针当前日录项信息目录末尾/失败返回 NULL日录末尾时emo不变失败时 ero被设置可通过perror排查。3.5.关闭目录closedir函数原型int closedir(DIR *dirp);功能关闭目录流释放目录资源对应opendir的反向操作。参数dirp为opendir返回的目录流指针。返回值成功返回0失败返回-1并设置errno。3.6.切换目录chdir函数原型int chdir(const char *pathname);功能切换进程的当前工作目录对应Linux终端命令cd进程后续的相对路径操作均基于新的工作目录。参数pathname目标工作目录的路径相对/绝对路径必须是存在的目录。返回值成功返回0失败返回-1并设置 ero常见错误ENOENT目录不存在、EACCES权限不足、ENOTDIR路径不是目录注意chdlir仅影响当前进程的工作目录不影响调用该进程的终端父进程工作目录。3.7.获取当前工作目录getcwd函数原型char *getcwd(char *buf,size_t size);功能获取进程当前的工作目录路径对应Linux终端命令pvd存入用户提供的缓冲区。参数buf接收工作目录路径的缓冲区指针需提前分配内存可使用栈缓冲区或堆缓冲区。size缓冲区的字节大小需足够容纳路径字符串\0结束符。返回值成功返回 buf指针与传入的缓冲区指针一致缓冲区中存储以IO结尾的工作目录路径失败返回NULL并设置 emo常见错误ERANGE缓冲区过小、EACCES权限不足。4.文件属性4.1.获取文件信息函数原型int stat(const char *path,struct stat *buf)int fstat(int fd,struct stat *buf)int lstat(const char *path,struct stat *buf)参数说明path文件路径fd文件描述符buf属性结构体返回值成功0失败NULL属性结构体如下所示struct stat { dev_t st_dev; // 普通文件所在存储器的设备号 mode_t st_mode; // 文件类型、文件权限 ino_t st_ino; // 文件索引号 nlink_t st_nlink; // 引用计数 uid_t st_uid; // 文件所有者的UID gid_t st_gid; // 文件所属组的GID dev_t st_rdev; // 特殊文件的设备号 off_t st_size; // 文件大小 blkcnt_t st_blocks; // 文件所占数据块数目 time_t st_atime; // 最近访问时间 time_t st_mtime; // 最近修改时间 time_t st_ctime; // 最近属性更改时间 blksize_t st_blksize; // 写数据块建议值 };该结构体中有很多成员的含义和作用是一目了然的比如文件索引号st_ino实质上是一个无符号整形数据用来唯一确定分区中的文件。引用计数st_nlink记录该文件的名字(或叫硬链接)总数文件的别名可以用命令link或者函数link()来创建。当一个文件的引用计数st_ nlink为零时系统将会释放清空该文件锁占用的一切系统资源。文件所有者UID和所属组GID。文件的大小。这个属性对只对普通文件有效。文件所占数据块数目st_ blocks表明该文件实际占用存储器空间。一个数据块一般为512字节。st_atime、st_mtime和st_ctime都是一个文件的时间戳st_atime代表文件被访问了但是没有被修改的最近时间st_mtime代表文件内容被修改的最近时间st_ctime则代表了文件属性更改的最近时间。文件的时间戳对于某些场合来讲是至关重要的属性比如工程管理器make,他的工作原理就完全基于文件的时间戳上判断文件的被修改时间决定其是否参与编译。st_blksize 是所谓的“写数据块”的建议值因为当应用程序频繁地往存储器写入小块数据的时候可能会导致效率的低下。4.2.分离主次设备号函数原型int major(dev_t dev) int minor(dev_t dev)参数说明dev文件的设备号属性来自stat结构体中的st_dev或者st_rdev返回值成功major返回主设备号minor返回次设备号失败无4.3.文件类型和权限属性成员中的st_ mode 里面包含了文件类型和权限st_ mode 实质上是-一个无符号16位短整型数各个位域所包含的含义如下st_mode[0:8]对应地代表了文件的各个用户的权限。st_ mode[9]存储了所谓的黏住位只对目录有效在拥有该目录的写权限的情况下如果这一位被设置为1,那么某一用户也只能删除在本目录下属于自己的文件否则可以删除任意文件。st_ mode[10]和st_ mode[11] 分别用来设置文件的suid只对普通文件有效和sgid只对目录有效。如果suid被设置为1则任何用户在执行该文件的时候均会获得该文件所有者的临时授权即其有效UID将等于文件所有者的UID。如果sgid被设置为1则任何在该目录下执行的程序均会获得该目录所属组成员的临时授权即其有效GID将等于该目录的所属组成员的GID。st_ mode[12:15]用以标识Linux下不同的文件类型由于Linux总共只有7种文件类型因此4位足以表达。下面的表格是st_ mode 的详细信息4.4.判断文件类型的宏4.5.判断文件是否存在函数原型int access(const char *filename, int mode);参数定义filename可以填写文件夹路径或者文件路径mode0 F_OK 只判断是否存在2 R_OK 判断写入权限4 W_OK 判断读取权限6 X_OK 判断执行权限用于判断文件夹是否存在的时候mode取0判断文件是否存在的时候mode可以取0、2、4、6。返回值成功若存在或者具有权限返回值为0失败不存在或者无权限返回值为-1