判断文件(快捷方式文件)存在的方式及对应区别(fstat、stat和lstat)

判断文件(快捷方式文件)存在的方式及对应区别(fstat、stat和lstat),第1张

stat系统调用系列包括了fstat、stat和lstat,它们都是用来返回“相关文件状态信息”的,三者的不同之处在于设定源文件的方式不同。

首先隆重介绍的是一个非常重要的”VIP”人物,他是fstat, stat和lstat三者都要用到的一个结构体类型,名字叫做struct stat。可以说,没有这个struct stat的支持,上述三个系统调用将寸步难行。

这个struct stat结构体在不同的UNIX/Linux系统中的定义是有小的区别的,但你完全不用担心,这并不会影响我们的使用。

在struct stat结构体中我们常用的且各个平台都一定有的域是:

我分别提取了solaris(UNIX)和fedora(Linux)的struct stat结构体的原始定义:大家可以自己比对一下便可以发现两者确实有所不同,但主要的域是完全相同的。

solaris的struct stat定义:

fedora的struct stat定义:

大家一定注意到了,在上面列举域的时御稿毁候,我在st_mode处使用了黑体橘红色标识,原因在于这个域不像其他域那么容易使用,其他的域的值显而易见,而st_mode域是需要一些宏予以配合才能使用的。其实,通俗说,这些宏就是一些特定位置为1的二进制数的外号,我们使用它们和st_mode进行”&” *** 作,从而就可以得到某些特定的信息。

文件类型标志包括:

还有一些用于帮助确定文件类型的宏定义,这些和上面的宏不一样,这些是带有参数的宏,类似与函数的使用方法:

我们已经学习完了struct stat和各种st_mode相关宏,现在就可以拿它们和stat系统调用相互配合工作了!

聪明人一眼就能看出来fstat的第一个参数是和另外两个不一样的,对!fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。

stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。(似乎有些晕吧,这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件的,因此当遇到符号链接文件时,lstat当然不会放过。而 stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一镇备只眼敬散,直接去处理链接所指文件喽)【链接文件相当于快捷方式,不清楚的请查阅软链接的相关资料】

把/Home/caton/b200.bin文件拷贝到了 /usr/local/share/uhd/images目录下,总是在提醒cp: 无法获取'home/caton/b200.bin' 的文件状态(stat): 没有那个文件或目录。在百度重搜了侍唤好几遍,终于找到了解决问题的方法,用下面的语句就好了微笑

sudo cp /home/灶陪caton/b200.bin /usr/local/share/uhd/images

对usr文件夹进行 *** 作需要有超老辩凯级管理员的权限才行,你可以切换为超级管理员进行 *** 作,或者在命令前面加 sudo;

stat(取得文件状态)

相关函数 fstat,lstat,chmod,chown,readlink,utime

表头文件 #include <sys/stat.h>

#include <unistd.h>

定义函数 int stat(const char * file_name,struct stat *buf)

函数说明 stat()用来将参数file_name所指的文件状态,复制到参数buf所指的结构中。哗纤察

下面是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 */

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 lastaccess*/

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 连到该文件的硬连接数目,刚建立的文件值为1。

st_uid 文件所有者的用户识别码

st_gid 文件所有者的组识别码

st_rdev 若此文件为装置设备文件,则为其设备编号

st_size 文件大小,以字节计算

st_blksize 文件系统的I/O 缓冲区大小。

st_blcoks 占用文件区块的个数,每一区块大小为512 个字节。

st_atime 文件最近一次被存取或被执行的时间,一般只有在用mknod、utime、read、write与tructate时改变。

st_mtime 文件最后一次被修改的时间,一般只有竖茄在用mknod、utime和write时才会改变

st_ctime i-node最近一乱茄次被更改的时间,此参数会在文件所有者、组、权限被更改时更新先前所描述的st_mode 则定义了下列数种情况

S_IFMT 0170000 文件类型的位遮罩

S_IFSOCK 0140000 scoket

S_IFLNK 0120000 符号连接

S_IFREG 0100000 一般文件

S_IFBLK 0060000 区块装置

S_IFDIR 0040000 目录

S_IFCHR 0020000 字符装置

S_IFIFO 0010000 先进先出

S_ISUID 04000 文件的(set user-id on execution)位

S_ISGID 02000 文件的(set group-id on execution)位

S_ISVTX 01000 文件的sticky位

S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限

S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限

S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限

S_IRGRP 00040 用户组具可读取权限

S_IWGRP 00020 用户组具可写入权限

S_IXGRP 00010 用户组具可执行权限

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) 是否为先进先出

S_ISSOCK (st_mode) 是否为socket

若一目录具有sticky 位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。

返回值 执行成功则返回0,失败返回-1,错误代码存于errno

错误代码 ENOENT 参数file_name指定的文件不存在

ENOTDIR 路径中的目录存在但却非真正的目录

ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接

EFAULT 参数buf为无效指针,指向无法存在的内存空间

EACCESS 存取文件时被拒绝

ENOMEM 核心内存不足

ENAMETOOLONG 参数file_name的路径名称太长

范例 #include <sys/stat.h>

#include <unistd.h>

mian()

{

struct stat buf

stat (“/etc/passwd”,&buf)

printf(“/etc/passwd file size = %d /n”,buf.st_size)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12244563.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存