文件操作
除文件I/O操作外,Linux系统的内核中还封装了许多具有丰富功能的函数,在编程工作中比较常用的函数有:stat()函数、accsee()函数、chmod()函数、truncate()函数、link()函数,下面对这几个函数进行讲解。
1、 stat()函数
stat()函数用于获取文件的属性,该函数存在于函数库sys/stat.h中,其声明如下:
int stat(const char *path, struct stat *buf);
stat()函数中的参数path为文件路径,参数buf为传出参数,用户接受获取到的文件属性。文件的属性存储于inode中,因此stat()函数实际上是从inode结构体中获取的文件信息。stat()函数的返回值为整型,当调用成功时函数返回0,调用失败时返回-1,并设置errno。stat()函数的参数分别为文件名与inode结构体指针,当该函数调用结束后,程序可以通过读取参数buf,获取文件的属性信息。
案例3:使用stat()函数,并输出文件的大小。
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/stat.h>
5
6 int main()
7 {
8 struct stat sbuf;
9 int ret=2;
10 ret=stat("a.out",&sbuf);
11 if(ret==-1){
12 perror("stat error:");
13 exit(1);
14 }
15 printf("len=%ld\n",sbuf.st_size);
16 return 0;
17 }
编译案例代码,执行二进制文件,输出结果如下:
len=7401
系统调用中还有一个lstat()函数,该函数与stat()功能相近,都能获取文件属性,只是在面向符号链接时,stat()会穿透符号链接,获取被连接文件的属性,而lstat()不穿透符号链接,直接获取符号链接文件的属性。lstat()函数的声明如下:
int lstat(const char *path, struct stat *buf);
若函数调用成功则返回0,失败返回-1,并设置errno的值。
lstat()通常用于判断文件类型,文件类型存储于参数inode结构体的成员st_mode的高4位中,当使用lstat()函数获取文件inode中的st_mode后,可以使用判断文件类型的一组宏函数判断文件类型,该组宏函数有7个,分别如下:
(1) S_ISREG(m)。判断文件是否为普通文件;
(2) S_ISDIR(m)。判断文件是否为目录文件;
(3) S_ISCHR(m)。判断文件是否为字符设备文件;
(4) S_ISBLK(m)。判断文件是否为块设备文件;
(5) S_ISFIFO(m)。判断文件是否为套接字文件;
(6) S_ISLNK(m)。判断文件是否为管道文件;
(7) S_ISSOCK(m)。判断文件是否为socket文件。
判断结果若为真,则是某种文件,否则反之。
2、access()函数
access()函数用于测试文件是否拥有某种权限,该函数存在于库函数unistd.h中,其声明如下:
int access(const char *pathname, int mode);
access()函数中第一个参数为文件名,第二个参数取值有4个:R_OK、W_OK、X_OK及F_OK,前3个值分别测试文件是具备读、写、执行权限,最后一个值测试文件是否存在。若该函数的返回值为0,表示调用成功,且指定文件存在或具有某个权限;若返回-1,则表示函数调用失败,或文件不存在或不具备某种权限。
3、 chmod()函数
chmod()函数用于修改文件的访问权限,该函数存在于函数库sys/stat.h中,其函数声明如下:
int chmod(const char *path, mode_t mode);
chmod()函数的第一个参数path为路径名,第二个参数用于传递修改后的权限。该函数的返回值为正数,修改成功返回0;失败返回-1,并设置errno值。
4、 truncate()函数
truncate()函数用于修改文件大小,常用于扩展文件,其功能与lseek()类似,该函数存在于函数库sys/stat.h中,其函数声明如下:
int truncate(const char *path, off_t length);
truncate()函数中的参数path为路径名,参数length用于设置文件大小。该函数的返回值为正数,同样成功返回0,失败返回-1,并设置errno的值。