C语言中获取文件状态的相关函数小结
C语言stat()函数:获取文件状态
头文件:
#include<sys/stat.h>#include<unistd.h>
定义函数:
intstat(constchar*file_name,structstat*buf);
函数说明:stat()用来将参数file_name所指的文件状态,复制到参数buf所指的结构中。
下面是structstat内各参数的说明:
structstat { dev_tst_dev;//device文件的设备编号 ino_tst_ino;//inode文件的i-node mode_tst_mode;//protection文件的类型和存取的权限 nlink_tst_nlink;//numberofhardlinks连到该文件的硬连接数目,刚建立的文件值为1. uid_tst_uid;//userIDofowner文件所有者的用户识别码 gid_tst_gid;//groupIDofowner文件所有者的组识别码 dev_tst_rdev;//devicetype若此文件为装置设备文件,则为其设备编号 off_tst_size;//totalsize,inbytes文件大小,以字节计算 unsignedlongst_blksize;//blocksizeforfilesystemI/O文件系统的I/O缓冲区大小. unsignedlongst_blocks;//numberofblocksallocated占用文件区块的个数,每一区块大小为512个字节. time_tst_atime;//timeoflastaccess文件最近一次被存取或被执行的时间,一般只有在用mknod、utime、read、write与tructate时改变. time_tst_mtime;//timeoflastmodification文件最后一次被修改的时间,一般只有在用mknod、utime和write时才会改变 time_tst_ctime;//timeoflastchangei-node最近一次被更改的时间,此参数会在文件所有者、组、权限被更改时更新 };
先前所描述的st_mode则定义了下列数种情况:
1、S_IFMT0170000文件类型的位遮罩
2、S_IFSOCK0140000scoket
3、S_IFLNK0120000符号连接
4、S_IFREG0100000一般文件
5、S_IFBLK0060000区块装置
6、S_IFDIR0040000目录
7、S_IFCHR0020000字符装置
8、S_IFIFO0010000先进先出
9、S_ISUID04000文件的(setuser-idonexecution)位
10、S_ISGID02000文件的(setgroup-idonexecution)位
11、S_ISVTX01000文件的sticky位
12、S_IRUSR(S_IREAD)00400文件所有者具可读取权限
13、S_IWUSR(S_IWRITE)00200文件所有者具可写入权限
14、S_IXUSR(S_IEXEC)00100文件所有者具可执行权限
15、S_IRGRP00040用户组具可读取权限
16、S_IWGRP00020用户组具可写入权限
17、S_IXGRP00010用户组具可执行权限
18、S_IROTH00004其他用户具可读取权限
19、S_IWOTH00002其他用户具可写入权限
20、S_IXOTH00001其他用户具可执行权限上述的文件类型在POSIX中定义了检查这些类型的宏定义
21、S_ISLNK(st_mode)判断是否为符号连接
22、S_ISREG(st_mode)是否为一般文件
23、S_ISDIR(st_mode)是否为目录
24、S_ISCHR(st_mode)是否为字符装置文件
25、S_ISBLK(s3e)是否为先进先出
26、S_ISSOCK(st_mode)是否为socket若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名.
返回值:执行成功则返回0,失败返回-1,错误代码存于errno。
错误代码:
1、ENOENT参数file_name指定的文件不存在
2、ENOTDIR路径中的目录存在但却非真正的目录
3、ELOOP欲打开的文件有过多符号连接问题,上限为16符号连接
4、EFAULT参数buf为无效指针,指向无法存在的内存空间
5、EACCESS存取文件时被拒绝
6、ENOMEM核心内存不足
7、ENAMETOOLONG参数file_name的路径名称太长
范例
#include<sys/stat.h> #include<unistd.h> main() { structstatbuf; stat("/etc/passwd",&buf); printf("/etc/passwdfilesize=%d\n",buf.st_size); }
执行:
/etc/passwdfilesize=705
C语言fstat()函数:由文件描述词取得文件状态
头文件:
#include<sys/stat.h>#include<unistd.h>
定义函数:
intfstat(intfildes,structstat*buf);
函数说明:fstat()用来将参数fildes所指的文件状态,复制到参数buf所指的结构中(structstat).Fstat()与stat()作用完全相同,不同处在于传入的参数为已打开的文件描述词.详细内容请参考stat().
返回值:执行成功则返回0,失败返回-1,错误代码存于errno.
范例
#include<sys/stat.h> #include<unistd.h> #include<fcntk.h> main() { structstatbuf; intfd; fd=open("/etc/passwd",O_RDONLY); fstat(fd,&buf); printf("/etc/passwdfilesize+%d\n",buf.st_size); }
执行:
/etc/passwdfilesize=705
C语言lstat()函数:由文件描述词取得文件状态
头文件:
#include<sys/stat.h>#include<unistd.h>
定义函数:
intlstat(constchar*file_name,structstat*buf);
函数说明:lstat()与stat()作用完全相同,都是取得参数file_name所指的文件状态,其差别在于,当文件为符号连接时,lstat()会返回该link本身的状态.详细内容请参考stat().
返回值:执行成功则返回0,失败返回-1,错误代码存于errno.
范例:参考stat()。