在Linux中文件总共被分成了7种,他们分别是:
(1)普通文件(regular) :存在于外部存储器中,用于存储普通数据。
(2)目录文件(directory) :用于存放目录项,是文件系统管理的重要文件类型。
(3)管道文件(pipe) :一种用于进程间通信的特殊文件,也称为命名管道FIFO。
(4)套接字文件(socket) :一种用于网络间通信的特殊文件。
(5)链接文件(link) :用于间接访问另外-一个目标文件,相当于Windows快捷方式。
(6)字符设备文件(character) :字符设备在应用层的访问接口。
(7)块设备文件(block):块设备在应用层的访问接口。
1.标准IO
(1)打开文件fopen()
函数原型:
FILE *fopen(const char *path,const char *mode)
参数说明:
path:即将要打开的文件
mode:"r":以只读方式打开文件,要求文件必须存在
"r+":以读写方式打开文件,要求文件必须存在
"w":以只写方式打开文件,文件如果不存在将会创建新文件,如果存在将会清空其内容
"w+":以读写方式打开文件,文件如果不存在将会创建新文件,如果存在将会清空其内容
"a":以只写方式打开文件,文件如果不存在将会创建新文件,且文件位置偏移量自动定位到文件末尾(即以追加方式写数据) "a+":以读写方式打开文件,文件如果不存在将会创建新文件,且文件位置偏移量自动定位到文件末尾(即以追加方式写数据)
返回值:
成功:文件指针
失败:NULL
(2)关闭文件fclose()
函数原型:
int fclose(FILE *fp)
参数说明:
fp:即将要关闭的文件
返回值:
成功:0
失败:EOF
(3)从文件中读取一个字符
函数原型:
int fgetc(FILE *stream)
int getc(FILE *stream)
int getchar(void)
参数说明:
stream:文件指针
返回值:
成功:读取到的字符
失败:EOF
(4)向文件中写入一个字符
函数原型:
int fputc(int c,FILE *stream)
int putc(int c,FILE *stream)
int putchar(int c)
参数说明:
stream:文件指针
c:要写入的字符
返回值:
成功:写入的字符
失败:EOF
(5)feof()和ferror()
函数原型:
int feof(FILE *stream)
int ferror(FILE*stream)
参数说明:
stream:文件指针
返回值:
feof:如果文件已达末尾则返回真,否则返回假
ferror:如果文件遇到错误则返回真,否则返回假
(6)从文件中读取字符串
函数原型:
char *fgets(char *s,int size,FILE *stream)
char *gets(char *s)
参数说明:
s:自定义缓冲区指针
size:自定义缓冲区大小
stream:文件指针
返回值:
成功:自定义缓冲区指针s
失败:NULL
备注:
gets()默认从文件stdin读取数据当返回NULL时,文件stream可能已达末尾,或者遇到错误
(7)向文件中写入字符串
函数原型:
int fputs(const char *s,FILE *stream)
int puts(const char *s)
参数说明:
s:自定义缓冲区指针
stream:文件指针
返回值:
成功:非负整数
失败:EOF
备注:
puts()默认将数据写入文件stdout
(8)读写操作fread()和fwrite()
函数原型:
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream)
参数说明:
ptr:自定义缓冲区指针
size:数据块大小
nmemb:数据块个数
stream:文件指针
返回值:
成功:读取或写入的数据块个数,等于nmemb
失败:读取或写入的数据块个数,小于nmemb或等于0
备注:
当返回小于nmemb时,文件stream可能已达末尾,或遇到错误
(9)设置文件当前位置偏移量
函数原型:
int fseek(FILE *stream,long offset,int whence)
参数说明:
stream:文件指针
offset:新文件偏移量相对基准点的偏移
whence(基准点):SEEK_SET:文件开头处
SEEK_CUR:当前位置
SEEK_END:文件末尾处
返回值:
成功:0失败:-1
(10)获取指定文件的当前位置偏移量
函数原型:
long ftell(FILE *stream)
参数说明:
stream:文件指针
返回值:
成功:当前文件位置偏移量
失败:-1
(11)将指定文件的当前位置偏移量设置到文件开头处
函数原型:
void rewind(FILE *stream)
参数说明:
stream:文件指针
2.文件IO
(1)打开文件open()
函数原型:
int open(const char *pathname,int flags)
int open(const char *pathname,int flags,mode_t mode)
参数说明:
pathname:即将要打开的文件
flags:O_RDONLY,以只读方式打开文件
O_WRONLY,以只写方式打开文件
O_RDWR,以读写方式打开文件
O_CREAT,如果文件不存在,则创建文件
O_EXCL,如果使用O_CREAT选项且文件存在,则返回错误信息
O_NOCTTY,如果文件为终端,那么终端不可以作为调用open()系统电影的那个进程的控制终端
O_TRUNC,如文件已经存在,则删除文件中的原数据
O_APPEND,以追加的方式打开文件
mode:如果文件被新建,指定其权限为mode(八进制表示法)
返回值:
成功:大于等于0的整数
失败:-1
(2)关闭文件close()
函数原型:
int close(int fd)
参数说明:
fd:文件描述符
返回值:
成功:0
失败:-1
备注:
重复关闭一个已经关闭了的文件或者尚未打开的文件是安全的
(3)文件的读写read()和write()
函数原型:
ssize_t read(int fd,void *buf,size_t count)
ssize_t write(int fd,const void *buf,size_t count)
参数说明:
fd:文件描述符
buf:指向存放读取数据的缓冲区,或者即将要写入的数据
count:想要读取或写入的字节数
返回值:
成功:实际读取或写入的字节数
失败:-1
备注:
实际读到或写入的字节数小于等于count
(4)调整文件位置偏移量lseek()
函数原型:
off_t lseek(int fd,off_t offset,int whence)
参数说明:
fd:文件描述符
offset:新位置偏移量相对基准点的偏移
whence:SEEK_SET,文件开头处
SEEK_CUR,当前位置
SEEK_END,文件末尾处
返回值:
成功:新文件位置偏移量
失败:-1
(5)复制文件描述符
函数原型:
int dup(int oldfd)
int dup2(int oldfd,int newfd)
参数说明:
oldfd:要复制的文件描述符
newfd:指定的新文件描述符
返回值:
成功:新的文件描述符
失败:-1
3.目录操作
(1)打开目录
函数原型:
DIR *opendir(const char *name)
参数说明:
name:目录名
返回值:
成功:目录指针失败:NULL
(2)读取目录
函数原型:
struct dirent *readdir(DIR *dirp)
参数说明:
dirp:读出目录项的目录指针
返回值:
成功:目录项指针
失败:NULL
从目录中读到的所谓目录项,是一个这样的结构体:
struct dirent{
ino_t d_ino; //文件索引号
off_t d_off; //目录项偏移量
unsigned short d_reclen; //该目录项大小
unsigned char d_type; //文件类型
char d_name[256]; //文件名
};
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 是所谓的“写数据块”的建议值,因为当应用程序频繁地往存储器写入小块数据的时候,可能会导致效率的低下。
(2)分离主次设备号
函数原型:
int major(dev_t dev)
int minor(dev_t dev)
参数说明:
dev:文件的设备号属性,来自stat结构体中的st_dev或者st_rdev
返回值:
成功:major返回主设备号,minor返回次设备号
失败:无
(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)判断文件类型的宏
(5)判断文件是否存在
函数原型:
int access(const char *filename, int mode);
参数定义:
filename:可以填写文件夹路径或者文件路径
mode:0 (F_OK) 只判断是否存在
2 (R_OK) 判断写入权限
4 (W_OK) 判断读取权限
6 (X_OK) 判断执行权限
用于判断文件夹是否存在的时候,mode取0,判断文件是否存在的时候,mode可以取0、2、4、6。
返回值:
成功:若存在或者具有权限,返回值为0
失败:不存在或者无权限,返回值为-1。