`
zhengdl126
  • 浏览: 2510038 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

stat,fstat以及lstat函数:检查文件的属性

    博客分类:
  • C
 
阅读更多

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

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

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

 

 



我们使用函数stat,fstat和lstat来检查文件的属性。这些函数使用struct stat对象来返回属性信息。所有这三个函数声明在头文件‘sys/stat.h’中。

Int   stat(const char *filename, struct stat *buf)   函数

Stat函数返回buf指向的结构体中filename项中保存的文件名的文件的属性信息。如果filename项是一个符号链接,你得到的是链接指向的文件的属性信息。 如果链接指向一个不存在的文件,则stat函数会报告一个文件不存在的失败消息。

如果操作成功的话,该函数返回值为0,失败则返回-1。除了通常的文件名错误外,还定义有如下的errno出错条件。

ENOENT              filename命名的文件不存在

如果使用_FILE_OFFSET_BITS==64来编译时,该函数实际上是stat64,因此使用大型文件支持的接口代替普通的实现。

Int   stat64(const char *filename, struct stat64 *buf)    函数

此函数与函数stat类似,区别在于它能够在32位系统上处理大小大于231的文件。为了达到效果,结果保存在一个struct stat64类型的变量中,就是buf指针指向的变量。当源代码中使用_FILE_OFFSET_BITS==64来编译时,该函数在使用stat为函数名时也有效,当然在32位机器代替小文件的接口。

Int   fstat (int filedes,struct stat *buf)  函数

Fstat函数与stat函数类似,只是在打开一个文件时使用文件描述符代替文件名做为参数 。详情查看Chapter 13【低级输入输出】。像stat函数一样,fstat函数调用成功返回值为0,失败则返回-1。下述errno错误情况针对fstat定义的:

EBADF          filedes参数是一个无效的文件描述符。

如果使用_FILE_OFFSET_BITS==64来编译时,该函数实际上是stat64,因此使用大型文件支持的接口代替普通的实现。

Int   fstat64(int filedes, struct stat64 *buf)                        函数

此函数与函数fstat类似,区别在于它能够在32位系统上处理大小大于231的文件。因为大型文件的文件描述符一般通过open64或者creat64来获得。Buf指针指向的变量类型是struct stat64,用于代表大型文件。当源代码中使用_FILE_OFFSET_BITS==64来编译时,该函数在使用stat为函数名时也有效,当然在32位机器代替小文件的接口。

Int   lstat (const char *filename, struct stat *buf)                函数

Lstat函数与stat函数类似,区别在于lstat函数不对符号链接进行追踪。如果参数filename是一个符号链接名,lstat函数仅仅返回链接本身的信息。 详情查看Section 14.5【符号链接】,否则lstat函数与stat函数作用相同。

如果使用_FILE_OFFSET_BITS==64来编译时,该函数实际上是stat64,因此使用大型文件支持的接口代替普通的实现。

Int   lstat64(const char *filename, struct stat64 *buf)         函数

此函数与函数stat类似,区别在于它能够在32位系统上处理大小大于231的文件。为了达到效果,结果保存在一个struct stat64类型的变量中,就是buf指针指向的变量。当源代码中使用_FILE_OFFSET_BITS==64来编译时,该函数在使用stat为函数名时也有效,当然在32位机器代替小文件的接口。

 

 

 



下面是struct stat 内各参数的说明:
struct stat{
        mode st_mode; /*文件类型和方式(许可数)*/
        ino st_ino;/* i-节点号(序列号)*/
        dev st_dev;/*设备号(文件系统)*/
        dev st_rdev;/*特殊文件的设备号*/
        nlink st_nlink;/*连接数*/
        uid st_uid;/*属主的用户ID*/
        gid st_gid;/*属主的组ID*/
        off st_size;/*普通文件的字节长度*/
        time st_atime;/*最后存取时间*/
        time st_mtime;/*最后修改存取时间*/
        time st_ctime;/*最后文件状态更改时间*/
        long st_blksize;/*最佳I/O块长*/
        long st_blocks;/*分配的512字节块块数
        };



范例
#include <sys/stat.h>
#include <unistd.h>
main()
{
    struct stat buf;
    stat("/etc/passwd", &buf);
    printf("/etc/passwd file size = %d \n", buf.st_size);
}

执行:
/etc/passwd file size = 705



至今我们已介绍了两种不同的文件类型-普通文件和目录。Unix系统的大多数文件是普通文件或目录,但是也有另外一些文件类型

  1.普通文件(Regular file)。这是最常见的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据对于系统核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。

  2.目录文件(Directory file)。这种文件包含了其它文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读许可数的任一进程都可以读该目录的内容,但只有系统核可以写目录文件。

  3.字符特殊文件(Charocter special file)。这种文件用于系统中的某些类型的设备。

  4.块特殊文件(Block special file)。这种文件典型地用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文件。

  5.FIFO。这种文件用于进程间的通信,有时也将其称为命名管道。在14.5对其进行说明。

   6.套接口(socket)。这种文件用于进程间的网络通信。套接口也可用于在一台宿主机上的进程之间的非网络通信。在第十五章,我们将用套接口进行进 程间的通信。只有4.3+BSD才返回套接口文件类型,虽然 SVR4支持用套接口进行进程间通信,但现在是经由套接口函数库实现的,而不是通过系统核内的套接口文件类型,将来的SVR4版本可能会支持套接口文件类 型。

  7.符号连接(Symboliclink)。这种文件指向另一个文件。我们在4.16中将更多地述及符号连接。

  文件类型信息,包含在stat结构的stode成员中。我们可以用图4.1中的宏确室文件类型。这些宏的参数都是stat结构中的stode成员。
  图4.1在中的文件类型宏

实例

#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
    int             i;
    struct stat buf;
    char             *msg;
   
    for ( i=1; i<argc; i++ )
    {
        printf( "%s:    ", argv[i] );
        if ( lstat(argv[i], &buf) < 0 )
        {
            printf("** lstat error.../n");
            continue;
        }
  
        if ( S_ISREG(buf.st_mode) )
        {
            msg = "regular";
        }
        else if ( S_ISDIR(buf.st_mode) )
        {
            msg = "directory";
        }
        else if ( S_ISCHR(buf.st_mode) )
        {
            msg = "character special";
        }
        else if ( S_ISBLK(buf.st_mode) )
        {
            msg = "block special";
        }
        else if ( S_ISFIFO(buf.st_mode) )
        {
            msg = "fifo";
        }
        else if ( S_ISLNK(buf.st_mode) )
        {
            msg = "symbolic link";
        }
        else if ( S_ISSOCK(buf.st_mode) )
        {
            msg = "socket";
        }
        else
        {
            msg = " ** unknown mode";
        }
      
        printf( "%s/n", msg );
    }
  
    exit (0);
}

  程序4.1取其命令行参数,然后针对每一个命令行参数打印其文件类型。
  程序4.1对每个命令行参数打印文件类型
  程序4.1的样本输出是:
  
  

$ ./a.out /etc /etc/profile /dev/tty0 /dev/sda1 /dev/cdrom /dev/log
/etc:   directory
/etc/profile:   regular
/dev/tty0:      character special
/dev/sda1:      block special
/dev/cdrom:     symbolic link
/dev/log:       socket

 

 

 

分享到:
评论

相关推荐

    UNIX环境高级编程(第四章)

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

    LINUX环境高级编程 第二章 文件管理

    文件的基本操作(打开、定位、读写、关闭) I/O效率 文件共享 其他重要I/O函数 ext2文件系统在磁盘的组织 stat、fstat、lstat函数 文件的基本性质 修改文件属性的函数 硬链接与符号连接 目录操作

    深入linux下遍历目录树的方法总结分析

    1、手动实现递归1.1 stat()函数族stat函数族包括:stat,fstat以及lstat函数,都是向用户返回文件的属性信息(元数据)。 代码如下:view plaincopy to clipboardprint?#include  int stat(const char*pathname,

    UNIX环境高级编程_第二版中文

    4.2 stat、fstat和lstat函数  4.3 文件类型  4.4 设置用户ID和设置组ID  4.5 文件访问权限  4.6 新文件和目录的所有权  4.7 access函数  4.8 umask函数  4.9 chmod和fchmod函数  4.10 粘住位  ...

    UNIX环境高级编程 pdf格式

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

    UNIX环境高级编程部分

    4.2 stat,fstat和lstat函数 4.3 文件类型 4.4 设置-用户-ID和设置-组-ID 4.5 文件存取许可权 4.6 新文件和目录的所有权 4.7 access函数 4.8 umask函数 4.9 chmod 和fchomod函数 4.10 粘住位 4.11 chown, fchown和 ...

    UNIX环境高级编程

    4.2 stat,fstat和lstat函数 4.3 文件类型 4.4 设置-用户-ID和设置-组-ID 4.5 文件存取许可权 4.6 新文件和目录的所有权 4.7 access函数 4.8 umask函数 4.9 chmod 和fchomod函数 4.10 粘住位 4.11 chown, fchown和 ...

    C语言中获取文件状态的相关函数小结

    这篇文章主要介绍了C语言中获取文件状态的相关函数小结,包括stat()函数和fstat()函数以及lstat()函数的使用,需要的朋友可以参考下.

    UNIX环境高级编程(第二版中文)

    4.2 stat、fstat和lstat函数 71 4.3 文件类型 72 4.4 设置用户ID和设置组ID 74 4.5 文件访问权限 75 4.6 新文件和目录的所有权 77 4.7 access函数 77 4.8 umask函数 79 4.9 chmod和fchmod函数 81 ...

    unix环境编程电子书

    68 习题 68 第4章 文件和目录 71 4.1 引言 71 4.2 stat、fstat和lstat函数 71 4.3 文件类型 72 4.4 设置用户ID和设置组ID 74 4.5 文件访问权限 75 4.6 新文件和目录的所有权 77 4.7 access函数 77 ...

    UNIX环境高级编程第二版

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

    IT行业中必备技能之UNIX最佳学习资料

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

    Unix高级编程 pdf

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10...

    UNIX环境高级编程和源代码

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

    UNIX环境高级编程(PDF)

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

    UNIX环境高级编程(中文版+英文版+源代码)

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

    UNIX环境高级编程.pdf

    4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 ...

Global site tag (gtag.js) - Google Analytics