`
zhengdl126
  • 浏览: 2543184 次
  • 性别: 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环境高级编程--第章 文件和目录.doc.doc

    本章将详细介绍文件和目录的属性、stat 函数、fstat 函数、lstat 函数等知识点,并且对目录进行操作的函数进行详细的解释。 文件类型 在 Unix 系统中,文件可以分为多种类型,包括普通文件、目录文件、符号连接...

    文件IO接口函数功能说明以及函数用法

    1. `stat/fstat/lstat` 函数: - 功能:获取文件的详细信息,如大小、属性、时间戳等。 - 需要包含的头文件:`#include &lt;sys/types.h&gt;`, `#include &lt;sys/stat.h&gt;`, `#include &lt;unistd.h&gt;` - 原型:`int stat...

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

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

    UNIX环境高级编程04

    《UNIX环境高级编程》第四章主要探讨了文件和目录的相关操作,包括`stat`、`fstat`和`lstat`函数的使用,文件类型,以及文件和目录的各种属性。以下是对这些知识点的详细说明: 1. **stat、fstat和lstat函数**: ...

    Unix环境高级编程

    我们将从`stat`函数入手,详细介绍其返回的结构体`stat`中的每一个成员变量,以便理解文件的各种属性。此外,还将介绍如何修改这些属性(例如更改文件所有者、权限等),并深入探索Unix文件系统的结构,包括符号链接...

    php操作文件函数

    40. **is_dir()**、**is_executable()**、**is_file()**、**is_link()**、**is_readable()**、**is_uploaded_file()**、**is_writable()** 和 **is_writeable()**:这些函数分别用于判断文件的各种属性,如是否为...

    php操作文件大全和mysql

    - **file_exists()**:检查文件或目录是否存在。 - **file_get_contents()**:读取整个文件到一个字符串中。 - **file_put_contents()**:写入字符串到文件。 - **file()**:读取整个文件到数组中,每行一个元素。 -...

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

    这一章从stat、fstat和lstat函数开始,这些函数用于获取文件的详细信息,包括文件类型、权限、所有权等。stat函数用于获取指定路径名的文件信息,fstat用于已打开文件描述符的文件信息,而lstat则特别处理符号链接的...

    Advanced Programming in the UNIX Envrionment

    文件和目录的章节进一步深入讨论了UNIX系统中文件的操作,包括文件属性的获取和修改(如stat、fstat、lstat函数)、文件类型、特殊权限位(如Set-User-ID和Set-Group-ID)、文件访问权限、新文件的所有权、umask函数...

    Linux常见系统调用列表介绍

    + lstat:参见 stat + fstat:参见 stat + statfs:取文件系统信息 + fstatfs:参见 statfs + readdir:读取目录项 + getdents:读取目录项 + mkdir:创建目录 + mknod:创建索引节点 + rmdir:删除目录 +...

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

    C语言中获取文件状态的相关函数小结 在C语言中,获取文件状态是非常重要的一步骤,特别是在文件操作中。...stat()函数、fstat()函数和lstat()函数都是获取文件状态的重要函数,在文件操作中起着非常重要的作用。

    文件和目录.docx

    `stat`函数通过文件路径获取属性,`fstat`则通过已打开的文件描述符获取,而`lstat`用于获取符号链接本身而非其指向的文件的属性。此外,`fstatat`函数提供了更多的灵活性,可以根据`flag`参数决定是否跟随符号链接...

    LinuxC函数之文件及目录函数.pdf

    还有其他一些常用的文件和目录操作函数,如`fchmod`、`fchown`、`chown`、`lchown`、`ftruncate`、`truncate`、`get_current_dir_name`、`getcwd`、`getwd`、`opendir`、`closedir`、`readdir`、`scandir`、`seekdir...

    Linux中stat函数和stat命令使用详解

    在Linux系统中,`stat`函数和`stat`命令是用于获取文件或文件系统状态的重要工具。它们提供了关于文件的详细信息,如inode、权限、大小、修改时间等。让我们深入了解一下这两个概念。 首先,`inode`是Linux文件系统...

    UNIX环境高级编程部分

    - **stat/fstat/lstat函数**:获取文件的状态信息。 - **文件类型**:普通文件、目录、符号链接等。 - **设置-用户-ID和设置-组-ID**:特殊权限位。 - **文件存取许可权**:读、写、执行权限。 - **新文件和目录的...

    unix环境高级编程英文版第2版.pdf 高清非扫描版

    文件与目录章节涉及了stat、fstat和lstat函数,它们用于获取文件的状态信息。书中还讨论了文件类型、设置用户ID和组ID、文件访问权限、新文件和目录的所有权、以及访问权限的检查和修改。所有权和权限的管理对于系统...

Global site tag (gtag.js) - Google Analytics