打开文件、新建文件和关闭文件操作
打开文件的一般形式是:
open(文件路径, 标志);
函数的返回值是文件描述符,如果打开文件成功返回一个正整数,否则返回–1。标志是用于指定打开文件操作模式的枚举常量,主标志见表
主标志是互斥的,使用其中一种则不能再使用另外一种。除了主标志以外,还有副标志可与它们配合使用,副标志可同时使用多个,使用时在主标志和副标志之间加入按位与( |)运算符,见表
创建新文件的同时可设置文件的权限,这时函数需要增加一组实际参数,形式为:
open(文件路径, 标志, 权限标志);
文件权限标志也可以使用加权数字表示,这组数字被称为 umask 变量,它的类型是
mode_t,是一个无符号八进制数。 umask 变量的定义方法如表 所示。 umask 变量由 3
位数字组成,数字的每一位代表一类权限。用户所获得的权限是加权数值的总和。例如 764
表示所有者拥有读、写和执行权限,群组拥有读和写权限,其他用户拥有读权限。
新建文件的另一个函数是 creat(),该函数的一般形式是:
creat(路径, umask);
当文件被成功创建函数的返回值为 0,否则为–1。当文件不需要使用了,则可以使用close()函数关闭文件。关闭文件的一般形式为 close(文件描述符),如果关闭文件成功, close()函数返回 0,否则返回–1。
文件状态和属性操作:
获取文件状态和属性操作可使用 fstat()、 lstat()和 stat()这 3 个函数来操作。 fstat()函数
用来返回一个已打开文件的状态和属性信息, lstat()和 stat()函数可对未打开文件进行操作。
lstat()和 stat()函数的区别是当文件是一个符号链接时, lstat 返回的是该符号链接本身的信
息;而 stat 返回的是该链接指向的文件的信息。它们的一般形式为:
fstat(文件标识符, struct stat *buf);
lstat(路径, struct stat *buf);
stat(路径, struct stat *buf);
其中结构体 struct stat 类型是 stat.h 函数库提供的一种用于保存文件类型的结构体。该
结构体成员的意义见表
其中, st_mode 与其他成员相比要复杂许多,必须使用标志与之进行按位与运算才能
获得相应信息。与前面按位或运算比较可得知,按位与运算其实只是按位或运算的逆操作。
st_mode 的标志见表
修改文件权限的系统调用函数是 chmod(),它与 shell 中的命令 chmod 作用相似。chmod
的一般形式是: chmod(路径, umask)。如果修改成功返回值为 0,否则返回–1。
#include <fcntl.h> //提供 open()函数
#include <sys/types.h> //提供 mode_t 类型
#include <sys/stat.h> //提供 open()函数的符号
#include <unistd.h> //提供 close()函数
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int f;
const char *f_path="fileop/1.txt";
mode_t f_attrib=S_IRGRP|S_IRUSR|S_IWUSR;
f=open(f_path,O_RDONLY);
if (f==-1){
f=creat(f_path,f_attrib);
if (f==-1){
puts("创建失败!");
}
}
struct stat *buf ;
buf= (struct stat *)malloc(sizeof(struct stat));
//int *p;
//p=(int *)malloc(sizeof(int));
fstat(f,buf);
if (buf->st_mode & S_IRUSR){
puts("文件主可读\n");
}
if (buf->st_mode & S_IRGRP){
puts("同组人可读\n");
}
close(f);
chmod(f_path,0771);
return 0;
}
常用目录操作是扫描子目录,与此相关的函数被封装在头文件 dirent.h
使用一个名为 DIR 的结构作为子目录处理的基础,这个结构的指针所指向的内存空间被
称之为子目录流。
遍历目录中所有文件的函数: