body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;}

获取文件相关信息
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *buf);    //(文件名,stat结构体指针)获取文件状态,存入buf,成功返回0,失败返回-1
int fstat(int fd, struct stat *buf);                 //(文件描述词,stat结构体指针)获取文件状态
stat和fstat区别是第一个形参,第一个是文件name,第二个是文件描述符
struct stat {
           dev_t         st_dev;                 /*如果是设备,返回设备表述符,否则为0*/
           ino_t         st_ino;                 /* i节点号 */
           mode_t       st_mode;                 /* 文件类型 */
           nlink_t       st_nlink;               /* 链接数 */
           uid_t         st_uid;                 /* 属主ID */
           gid_t         st_gid;                 /* 组ID */
           dev_t         st_rdev;                /* 设备类型*/
           off_t         st_size;                /* 文件大小,字节表示 */
           blksize_t     st_blksize;             /* 块大小*/
           blkcnt_t     st_blocks;               /* 块数 */
           time_t       st_atime;                /* 最后访问时间*/
           time_t       st_mtime;                /* 最后修改时间*/
           time_t       st_ctime;                /* 最后权限修改时间 */
};

char *ctime(const time_t *timep);   //time_t是一个秒数字符串,这个函数可以返回我们能识别的时间字符串

//stat.c
#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
void drop_last(char *buf)
{
        char *p=buf;
        while(*p!='\0')
        {
                p++;
        }
        while(*p!=':')
        {
                p--;
        }
        *p='\0';
}
int main(int argc,char **argv)
{
        struct stat s;
        memset(&s,0,sizeof(struct stat));
        int ret = stat(argv[1],&s);
        char *p = ctime(&(s.st_mtime));
        printf("%s\n",p);
        drop_last(p);
        char str[128];
        strcpy(str,p+4);
        printf("%ld %ud %ld %5d %5d %ld %s %s\n", s.st_ino, s.st_mode, s.st_nlink, s.st_uid, s.st_gid, s.st_size, str, argv[1]);
        return 0;
}
[meihao@ubuntu ~/learning/11022017/dirInfo]$>./a.out stat.c
Thu Nov  2 06:19:18 2017
208001 33204d 1  1000  1000 567 Nov  2 06:19 stat.c
[meihao@ubuntu ~/learning/11022017/dirInfo]$>find -name stat.c -exec ls -ail {} \;
208001 -rw-rw-r-- 1 meihao meihao 567 Nov  2 06:19 ./stat.c

[meihao@ubuntu ~/learning/11022017/dirInfo]$>id
uid=1000(meihao) gid=1000(meihao) groups=1000(meihao),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)


[meihao@ubuntu ~/learning/11032017]$>cat /etc/passwd  
//查看配置信息


传入 uid,gid,获取对应信息
#include <sys/types.h>
#include <pwd.h>
struct  passwd *getpwuid(uid_t  uid);  //传入uid 返回uid对应组的所有信息
#include <sys/types.h>
#include <grp.h>
struct  group *getgrgid(gid_t gid);  //传入gid 返回gid对应组的所有信息
struct  passwd {
              char  *pw_name;           /* username */
              char  *pw_passwd;         /* user password */这个密码不是明文的
              uid_t  pw_uid;            /* user ID */
              gid_t  pw_gid;            /* group ID */
              char  *pw_gecos;          /* user information */
              char  *pw_dir;            /* home directory */家目录
              char  *pw_shell;          /* shell program */
            }; 
文件放在这个目录里 -> cat /etc/passwd 查看到的信息就是这个结构体保存的信息 -> meihao:x:1000:1000:ubuntu,,,:/home/meihao:/bin/bash
struct group {
               char   *gr_name;              /* group name */
               char   *gr_passwd;            /* group password */
               gid_t   gr_gid;               /* group ID */
               char  **gr_mem;  /* NULL-terminated array of pointers to names of group members */                       
};
文件放在这个目录里 -> cat /etc/group


//stat.c
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<time.h>
#include<stdio.h>
#include<pwd.h>
#include<grp.h>
void change_time_type(char *t)
{
        char *p;
        p=t+strlen(t)-1;
        while( *p != ':' )
        {
                p--;
        }
        *p='\0';
}
int main(int argc,char **argv)
{
        if(2!=argc)
        {
                printf("error args\n");
                return -1;
        }
        struct stat buf;
        memset(&buf,0,sizeof(buf));
        int ret = stat(argv[1],&buf);
        if(-1==ret)
        {
                perror("stat");
                return -1;
        }
        char t[128];
        strcpy(t,ctime(&buf.st_mtime));
        change_time_type(t);
        printf("%5x %ld %s %s %ld %s %s\n",buf.st_mode, buf.st_nlink, getpwuid(buf.st_uid)->pw_name, getgrgid(buf.st_gid)->gr_name, buf.st_size, t+4, argv[1]);
        return 0;
}
// %5x buf.st_mode

//现在要做的就是把得到的十六进制的st_mode转换成ls -l最开头的那种形式。

文件类型mode存的是一个无符号短整型,一个无符号短整型占2个字节,16位,中12位是存权限位,有三位?;
剩下的4位是用来存文件类型,这就是LINUX只能有16中文件类型



man stat , 查看里面的宏定义
这里面都是宏定义,开头为0表示8进制;
st_mode 转成8进制就是对应文件类型和权限代表的4位8进制数。st_mode 是16位
0000 000 000 000 000 -》(文件类型,不认识 ,Uperm , Gperm , Operm)
八进制017==1111,所以文件类型只有0-15一共16种
//可以直接用提供的宏定义来判断是什么文件
//这个就是文件对应每个组的权限
//stat.c  //只判断两种文件类型,4代表目录,8代表普通文件
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<time.h>
#include<stdio.h>
#include<pwd.h>
#include<grp.h>
void change_time_type(char *t)
{
        char *p;
        p=t+strlen(t)-1;
        while( *p != ':' )
        {
                p--;
        }
        *p='\0';
}
int main(int argc,char **argv)
{
        if(2!=argc)
        {
                printf("error args\n");
                return -1;
        }
        struct stat buf;
        memset(&buf,0,sizeof(buf));
        int ret = stat(argv[1],&buf);
        if(-1==ret)
        {
                perror("stat");
                return -1;
        }
        char t[128];
        strcpy(t,ctime(&buf.st_mtime));
        change_time_type(t);
        char perm[10];
        memset(perm,'-',sizeof(perm));
        change_st_mode(perm,buf);
        printf("%s %ld %s %s %ld %s %s\n",perm, buf.st_nlink, getpwuid(buf.st_uid)->pw_name, getgrgid(buf.st_gid)->gr_name, buf.st_size, t+4, argv[1]);
        return 0;
}
void change_st_mode(char *perm,struct stat buf)
{
        unsigned int S_RWE;
        unsigned int S_INIT;
        if( (S_IFMT & buf.st_mode)==S_IFREG  )
        {
                perm[0]='-';
        }
        else if( (S_IFMT & buf.st_mode)==S_IFDIR  )
        {
                perm[0]='d';
        }
        else
        {
                perm[0]='*';
        }
        int j=1;
        for(int i=0;i<3;i++)
        {
                S_INIT=00400;  //100->'r'
                S_INIT=S_INIT>>(i*3);
                if( (S_INIT & buf.st_mode)==S_INIT )
                {
                        perm[j++]='r';
                }
                else
                {
                        perm[j++]='-';
                }
                S_INIT=S_INIT>>1;
                if( (S_INIT & buf.st_mode)==S_INIT )
                {
                        perm[j++]='w';
                }
                else
                {
                        perm[j++]='-';
                }
                S_INIT=S_INIT>>1;
                if( (S_INIT & buf.st_mode)==S_INIT )
                {
                        perm[j++]='x';
                }
                else
                {
                        perm[j++]='-';
                }
        }
        perm[j]='\0';
        printf("%s\n",perm);
}
void change_st_mode(char *perm,struct stat buf)
{
        if ( S_ISDIR(buf.st_mode) )
        {
                perm[0]='d';
        }
        if( (S_ISREG(buf.st_mode) )
        {
                perm[0]='-';
        }
        else
        {       
                perm[0]='*';
        }
        if( (buf.st_mode & S_IRUSR)==S_IRUSR )
        {
                perm[1]='r';
        }
        if( (buf.st_mode & S_IWUSR)==S_IWUSR )
        {
                perm[2]='w';
        }
        if( (buf.st_mode & S_IXUSR)==S_IXUSR )
        {
                perm[3]='x';
        }
        if( (buf.st_mode & S_IRGRP)==S_IRGRP )
        {
                perm[4]='r';
        }
        if( (buf.st_mode & S_IWGRP)==S_IWGRP )
        {
                perm[5]='w';
        }
        if( (buf.st_mode & S_IXGRP)==S_IXGRP )
        {
                perm[6]='x';
        }
        if( (buf.st_mode & S_IROTH)==S_IROTH )
        {
                perm[7]='r';
        }
        if( (buf.st_mode & S_IWOTH)==S_IWOTH )
        {
                perm[8]='w';
        }
        if( (buf.st_mode & S_IXOTH)==S_IXOTH )
        {
                perm[9]='x';
        }
        perm[10]='\0';
}

LINUX获取文件信息的更多相关文章

  1. 【转】linux C++ 获取文件信息 stat函数详解

    stat函数讲解 表头文件:    #include <sys/stat.h>             #include <unistd.h>定义函数:    int stat ...

  2. Linux获取网络接口信息

    linux获取网络接口信息需要用到的函数为ioctl(),结构体struct ifreq,struct ifconf 1.ioctl()函数原型及作用 #include <sys/ioctl.h ...

  3. FastDFS 通过文件名获取文件信息

    /** * 获取文件信息 * * param string group_name 文件所在的组名 * param string file_id 文件id(如: M00/09/BE/rBBZolgj6O ...

  4. C# -- 使用FileInfo获取文件信息

    C# -- 使用FileInfo获取文件信息 1. 代码实现 static void Main(string[] args) { GetFileInfo(@"D:\Test.xlsx&quo ...

  5. C#中获取文件信息的代码

    如下的内容内容是关于C#中获取文件信息的内容,应该对大伙有一些好处. FileInfo fi = new FileInfo(@"C:file.txt"); if(fi.Exists ...

  6. C#开发BIMFACE系列6 服务端API之获取文件信息

    在<C#开发BIMFACE系列4 服务端API之源上传文件>.<C#开发BIMFACE系列5 服务端API之文件直传>两篇文章中详细介绍了如何将本地文件上传到BIMFACE服务 ...

  7. C#开发BIMFACE系列7 服务端API之获取文件信息列表

    系列目录     [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...

  8. 拖放获取文件信息的bat代码

    参考:岁月如歌-通过拖曳获取文件信息的bat代码 拖放获取文件信息的bat代码 使用命令行配合7z解压文件时由于每次解压的文件不同,因此搜索了一下拖放识别文件信息的方法,以此方式来减轻工作量 获取文件 ...

  9. linux 获取文件系统信息(磁盘信息)

    源代码例如以下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <s ...

随机推荐

  1. centos 6 网卡名称修改

    centos6 中网卡的名字有时不是eth0,这时就会带来诸多不便,为此需要修改网卡的名称. 修改网卡名称vim /etc/sysconfig/network-scripts/ifcfg-eno167 ...

  2. Java学习笔记【持续更新】

    一个简单的java程序如下: class Sakura { public static void main(String[] arges) { system.out.println("Hel ...

  3. BZOJ:4826: [Hnoi2017]影魔

    Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵 ...

  4. [HDU3247]Resource Archiver

    AC自动机+状压DP 首先对所有串建AC自动机,然后对于每个资源串,算出从串末走到其他资源串末所需的距离(中途避开非法点) 也就是算出两两间的距离...然后就变成旅行商问题了. 计算距离的时候要考虑一 ...

  5. HDU1465-装错信封-递推

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. c++2(循环和递归)

    其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就 ...

  7. docker创建ceph集群

    背景 Ceph官方现在提供两类镜像来创建集群,一种是常规的,每一种Ceph组件是单独的一个镜像,如ceph/daemon.ceph/radosgw.ceph/mon.ceph/osd等:另外一种是最新 ...

  8. [国嵌笔记][012][GCC程序编译]

    GCC特点 GCC(GUN C Compiler)是GUN推出的功能强大.性能优越的多平台编译器.其执行效率与一般编译器相比平均效率要高20%~30%. GCC基本用法 gcc [options] f ...

  9. IE8兼容border-radius.

    我们知道,CSS3新增的很多简洁优美的属性,比如border-radius.box-shadow.border-image.gradients.RGBA...因为这些属性的出现,我们可以很方便的就写会 ...

  10. css3渐变之线性渐变

    css3定义了两种类型的渐变,即线性渐变和径向渐变.这里我要说的是线性渐变. 为了创建一个线性渐变,你必须至少定义两种颜色结点.颜色结点即你想要呈现平稳过渡的颜色.同时,你也可以设置一个起点和一个方向 ...