相关函数:fstat, lstat, chmod, chown, readlink, utime
表头文件:#include
#include
定义函数:int stat(const char *file_name, struct stat *buf);
函数说明:stat()用来将参数file_name所指的文件状态, 复制到参数buf所指的结构中(struct stat)。 下面是struct stat 内各参数的说明
struct stat
{
dev_t st_dev; /*device*/
ino_t st_ino; /*inode*/
mode_t st_mode; /*protection*/
nlink_t st_nlink; /*number
of hard links */
uid_t st_uid;
/*user ID of owner*/
gid_t st_gid;
/*group ID of owner*/
dev_t st_rdev; /*device type (if inodedevice)*/
off_t st_size; /*total
size, in bytes*/
unsigned
long st_blksize;
/*blocksize for filesystem I/O*/
unsigned
long st_blocks; /*
number of blocks allocated*/
time_t st_atime; /*time
of last access*/
time_t st_mtime;
/*time of last modification*/
time_t st_ctime;
/*time of last change*/
};
st_dev 文件的
编号
st_ino 文件的i-node
st_mode 文件的类型和存取的
st_nlink 连到该文件的硬连接(hard link)数目, 刚建立的文件值为1
st_uid 文件所有者的用户识别码(user ID)
st_gid 文件所有者的组识别码(group ID)
st_rdev 若此文件为装置
文件,则为其
编号
st_size 文件大小,以字节计算
st_blksize 文件
的I/O缓冲区大小
st_blocks 占用文件区块的个数,每一区块大小为512个字节
st_atime 文件最近一次被存取或被执行的
,一般只有在用mknod, utime, read, write 与 truncate时改变
st_mtime 文件最后一次被修改的
,一般只有在用mknod, utime 和 write时才会改变
st_ctime i-node最近一次被更改的
,此参数会在文件所有者、组、
被更改时更新
st_mode定义的情况
S_IFMT
0170000
文件类型的位遮罩
S_IFSOCK
0140000
socket
S_IFLNK 0120000
符号连接(symbolic link)
S_IFREG 0100000
一般文件
S_IFBLK 0060000
区块装置(block device)
S_IFDIR 0040000
S_IFCHR 0020000
字符装置(character device)
S_IFIFO 0010000
先进先出(fifo)
S_ISUID 0004000
文件的(set user-id on execution) 位
S_ISGID 0002000
文件的(set group-id on execution)位
S_ISVTX
0001000
文件的sticky位
S_IRWXU 00700
文件所有者的遮罩值(即所有
值)
S_IRUSR
00400
文件所有者具
可读取
S_IWUSR 00200
文件所有者具可写入
S_IXUSR 00100
文件所有者具可执行
S_IRWXG 00070
用户组遮罩值
S_IRGRP 00040
用户组具可读取
S_IWGRP
00020
用户组具可写入
S_IXGRP 00010
用户组具可执行
S_IRWXO 00007
其他用户的遮罩值(即所有
值)
S_IROTH 00004
其他用户具可读取
S_IWOTH 00002
其他用户具可写
S_IXOTH 00001
其他用户具可执行
上述的文件类型在POSIX中定义了检查这些类型的宏定义:
S_ISLNK(st_mode)
判断是否为符号连接
S_ISREG(st_mode)
是否为一般文件
S_ISDIR(st_mode)
是否为
S_ISCHR(st_mode)
是否为字符装置文件
S_ISBLK(s3e)
是否为先进先出(fifo)
S_ISSOCK(st_mode)
是否为socket
若一
具有sticky位(S_ISVTX), 则表示在此
下的文件只能被该文件所有者、此
所有者或root来删除(delete)或改名(rename)
返回值: 执行成功返回0, 失败返回-1, 错误代码存于errno
错误代码:ENOENT
参数file_name指定的文件不存在
ENOTDIR
路径中的
存在但却非真正的
ELOOP
欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT
参数buf为无效指针,指向无法存在的
EACCESS
存取文件时被拒绝
ENOMEM
不足
ENAMETOOLONG
参数file_name的路径名称太长
范例:
/*显示 /etc/passwd文件大小*/
#include
#include
main()
{
struct stat buf;
stat("/etc/passwd", &buf);
printf("/etc/passwd file size = %d\n", buf.st_size);
}
阅读(1982) | 评论(0) | 转发(0) |