• 【linux c learn 之stat】获取文件的属性


    NAME

           stat 获取文件属性

    这个函数位于<sys/stat.h>头文件里

    函数原型:

    int  stat(const char *path, struct stat *buf);

    參数:

    path  文件路径+文件名称

    buf     指向buffer的指针

    返回值:

    -1   遇到错误

    0    成功返回

    函数作用:

    把path文件的信息拷贝到指针buf所指的结构体中。


    描写叙述

    stat结构体:

    struct stat {
                   dev_t     st_dev;     /* ID of device containing file */
                   ino_t     st_ino;     /* inode number */
                   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 ID (if special file) */
                   off_t     st_size;    /* total size, in bytes */
                   blksize_t st_blksize; /* blocksize for filesystem I/O */
                   blkcnt_t  st_blocks;  /* number of 512B 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 status change */
               };

    dev_t 包括设备文件的ID

    st_ino i结点

    st_mode 文件类型和许可权限

    st_nline 文件链接数

    st_uid 用户全部者的ID

    st_gid 所属组的ID

    st_rdev 设备ID(假设指定文件)

    st_size  所占的字节数

    st_blksize 文件系统I/O块大小

    st_block 分配的512B大小的

    st_atime 最后訪问时间

    st_mtime 最后改动时间

    st_ctime 状态最后改变时间


    以下的POSIX宏定义用于核对st_mode域的文件类型

               S_ISREG(m)  是常规文件?
    
               S_ISDIR(m)  文件夹?
    
               S_ISCHR(m)  字符设备?
    
               S_ISBLK(m)  块设备?
    
               S_ISFIFO(m) FIFO?
    
               S_ISLNK(m)  符号链接?  (Not in POSIX.1-1996.)
    
               S_ISSOCK(m) 套接字?  (Not in POSIX.1-1996.)

    以下的标志用于st_mode域:

               S_IFMT     0170000   bit mask for the file type bit fields
               S_IFSOCK   0140000   socket
               S_IFLNK    0120000   symbolic link
               S_IFREG    0100000   regular file
               S_IFBLK    0060000   block device
               S_IFDIR    0040000   directory
               S_IFCHR    0020000   character device
               S_IFIFO    0010000   FIFO
               S_ISUID    0004000   set-user-ID bit
               S_ISGID    0002000   set-group-ID bit (see below)
               S_ISVTX    0001000   sticky bit (see below)
               S_IRWXU    00700     mask for file owner permissions
               S_IRUSR    00400     owner has read permission
               S_IWUSR    00200     owner has write permission
               S_IXUSR    00100     owner has execute permission
               S_IRWXG    00070     mask for group permissions
               S_IRGRP    00040     group has read permission
               S_IWGRP    00020     group has write permission
               S_IXGRP    00010     group has execute permission
               S_IRWXO    00007     mask for permissions for others (not in group)
               S_IROTH    00004     others have read permission
               S_IWOTH    00002     others have write permission
               S_IXOTH    00001     others have execute permission

    实例:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <time.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        struct stat info;
        
        if (argc != 2)
        {
            fprintf(stderr, "Usage: %s <pathname>
    ", argv[0]);
            exit(EXIT_FAILURE);
        }
    
        if (stat(argv[1], &info) == -1)
        {
            perror("stat");
            exit(EXIT_FAILURE);
        }
    
        printf("File type;                  ");
    
        switch(info.st_mode & S_IFMT)
        {
            case S_IFBLK:   printf("block device
    ");       break;
            case S_IFCHR:   printf("character device
    ");   break;
            case S_IFDIR:   printf("directory
    ");          break;
            case S_IFIFO:   printf("FIFO pipe
    ");          break;
            case S_IFLNK:   printf("symlink
    ");            break;
            case S_IFREG:   printf("regular file
    ");       break;
            case S_IFSOCK:  printf("socket
    ");             break;
            default:        printf("unknown
    ");            break;
        }
    
        printf("I-node number:              %ld
    ", (long)info.st_ino);
        printf("Mode:                       %lo(octal)
    ",
                (unsigned long)info.st_mode);
        printf("Link count:                 %ld
    ", (long)info.st_nlink);
        printf("Ownership:                  UID=%ld GID=%ld
    ",
                (long)info.st_uid, (long)info.st_gid);
    
        printf("Preferred I/O block size:   %ld bytes
    ",
                (long) info.st_blksize);
        printf("File size:                  %lld bytes
    ",
                (long long) info.st_size);
        printf("Blocks allocated:           %lld
    ",
                (long long) info.st_blocks);
    
        printf("Last status change:         %s", ctime(&info.st_ctime));
        printf("Last file access:           %s", ctime(&info.st_atime));
        printf("Last file modification:     %s", ctime(&info.st_mtime));
    
        exit(EXIT_SUCCESS);
    }

    执行结果:

    liujl@liujl-ThinkPad-Edge-E431:~/linux_program/list$ ./stat stat.c
    File type;                  regular file
    I-node number:              679622
    Mode:                       100644(octal)
    Link count:                 1
    Ownership:                  UID=1000 GID=1000
    Preferred I/O block size:   4096 bytes
    File size:                  2102 bytes
    Blocks allocated:           8
    Last status change:         Wed Jul 16 23:26:20 2014
    Last file access:           Wed Jul 16 23:26:35 2014
    Last file modification:     Wed Jul 16 23:26:20 2014
    






    附录为/usr/include/sys/stat.h源代码:

    /*-
     * Copyright (c) 1982, 1986, 1989 The Regents of the University of California.
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     * 1. Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     * 2. Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     * 3. All advertising materials mentioning features or use of this software
     *    must display the following acknowledgement:
     *	This product includes software developed by the University of
     *	California, Berkeley and its contributors.
     * 4. Neither the name of the University nor the names of its contributors
     *    may be used to endorse or promote products derived from this software
     *    without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     * SUCH DAMAGE.
     *
     *	@(#)stat.h	7.11 (Berkeley) 3/3/91
     */
    
    struct stat
    {
    	dev_t	st_dev;			/* inode's device */
    	ino_t	st_ino;			/* inode's number */
    	mode_t	st_mode;		/* inode protection mode */
    	nlink_t	st_nlink;		/* number of hard links */
    	uid_t	st_uid;			/* user ID of the file's owner */
    	gid_t	st_gid;			/* group ID of the file's group */
    	dev_t	st_rdev;		/* device type */
    	off_t	st_size;		/* file size, in bytes */
    	time_t	st_atime;		/* time of last access */
    	long	st_spare1;
    	time_t	st_mtime;		/* time of last data modification */
    	long	st_spare2;
    	time_t	st_ctime;		/* time of last file status change */
    	long	st_spare3;
    	long	st_blksize;		/* optimal blocksize for I/O */
    	long	st_blocks;		/* blocks allocated for file */
    	u_long	st_flags;		/* user defined flags for file */
    	u_long	st_gen;			/* file generation number */
    };
    
    #define	S_ISUID	0004000			/* set user id on execution */
    #define	S_ISGID	0002000			/* set group id on execution */
    #ifndef _POSIX_SOURCE
    #define	S_ISTXT	0001000			/* sticky bit */
    #endif
    
    #define	S_IRWXU	0000700			/* RWX mask for owner */
    #define	S_IRUSR	0000400			/* R for owner */
    #define	S_IWUSR	0000200			/* W for owner */
    #define	S_IXUSR	0000100			/* X for owner */
    
    #ifndef _POSIX_SOURCE
    #define	S_IREAD		S_IRUSR
    #define	S_IWRITE	S_IWUSR
    #define	S_IEXEC		S_IXUSR
    #endif
    
    #define	S_IRWXG	0000070			/* RWX mask for group */
    #define	S_IRGRP	0000040			/* R for group */
    #define	S_IWGRP	0000020			/* W for group */
    #define	S_IXGRP	0000010			/* X for group */
    
    #define	S_IRWXO	0000007			/* RWX mask for other */
    #define	S_IROTH	0000004			/* R for other */
    #define	S_IWOTH	0000002			/* W for other */
    #define	S_IXOTH	0000001			/* X for other */
    
    #ifndef _POSIX_SOURCE
    #define	S_IFMT	 0170000		/* type of file */
    #define	S_IFIFO	 0010000		/* named pipe (fifo) */
    #define	S_IFCHR	 0020000		/* character special */
    #define	S_IFDIR	 0040000		/* directory */
    #define	S_IFBLK	 0060000		/* block special */
    #define	S_IFREG	 0100000		/* regular */
    #define	S_IFLNK	 0120000		/* symbolic link */
    #define	S_IFSOCK 0140000		/* socket */
    
    #define	S_ISVTX	 0001000		/* save swapped text even after use */
    
    #define S_BLKSIZE	512		/* block size used in the stat struct */
    
    					/* 0666 */
    #define	DEFFILEMODE	(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
    #endif
    
    #define	S_ISDIR(m)	((m & 0170000) == 0040000)	/* directory */
    #define	S_ISCHR(m)	((m & 0170000) == 0020000)	/* char special */
    #define	S_ISBLK(m)	((m & 0170000) == 0060000)	/* block special */
    #define	S_ISREG(m)	((m & 0170000) == 0100000)	/* regular file */
    #define	S_ISFIFO(m)	((m & 0170000) == 0010000)	/* fifo */
    #ifndef _POSIX_SOURCE
    #define	S_ISLNK(m)	((m & 0170000) == 0120000)	/* symbolic link */
    #define	S_ISSOCK(m)	((m & 0170000) == 0140000)	/* socket */
    #endif
    
    #ifndef KERNEL
    #include <sys/cdefs.h>
    
    __BEGIN_DECLS
    mode_t	umask __P((mode_t));
    int	chmod __P((const char *, mode_t));
    int	fstat __P((int, struct stat *));
    int	mkdir __P((const char *, mode_t));
    int	mkfifo __P((const char *, mode_t));
    int	stat __P((const char *, struct stat *));
    #ifndef _POSIX_SOURCE
    int	fchmod __P((int, mode_t));
    int	lstat __P((const char *, struct stat *));
    #endif /* not POSIX */
    __END_DECLS
    #endif



  • 相关阅读:
    利用userData实现客户端保存表单数据
    随机提取10条记录
    分页的文本显示
    用VB.NET写的一个简易的RSS阅读器
    怎样提高你的Google Adsense收入?
    全球500家最大公司及网址
    HTC教程
    老百姓是这样买房的
    使用JavaScript+XML实现分页
    恋爱的奇妙感觉,当爱在靠近...
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4009211.html
Copyright © 2020-2023  润新知