stat 的使用

Linux有个命令,ls -l,效果如下:

这个命令能显示文件的类型、操作权限、硬链接数量、属主、所属组、大小、修改时间、文件名。它是怎么获得这些信息的呢,请看下面的讲解。

stat 的基本使用

stat:返回一个与此命

需要包含的头文件: <sys/types.h>,<sys/stat.h>,<unistd.h>

函数原型:

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

参数:

  对于stat() & lstat()来说path,是要查看属性的文件或目录的全路径名称

  对于fstat,fd 是要查看属性文件的文件描述符

  buf:指向用于存放文件属性的结构体,函数成功调用后,buf各个字段存放各个属性。

返回值 成:

  功返回0;      错误返回 -1;

给定一个文件:

  stat 函数获得一个与此命名文件有关的信息(到一个struct stat 类型的buf中) 。

  fstat 函数获得文件描述符 fd 打开文件的相关信息(到一个struct stat 类型的buf中) 。

  lstat 函数类似于 stat,但是当命名文件是一个符号连接时, lstat 获取该符号连接的有关信息,而不是由该符号连接引用文件的信息。

struct stat在系统头文件<stat.h>中,具体定义如下:

 1 struct stat    
2 {    
3     dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/    
4     ino_t       st_ino;     /* inode number -inode节点号*/  
5     mode_t      st_mode;    /* Protection -文件的类型和存取的权限*/    
6     nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/    
7     uid_t       st_uid;     /* user ID of owner -user id*/    
8     gid_t       st_gid;     /* group ID of owner - group id*/    
9     dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/    
10     off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/    
11     blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/     12     blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/    
13     time_t      st_atime;   /* time of last access -最近存取时间*/    
14     time_t      st_mtime;   /* time of last modification -最近修改时间*/    
15     time_t      st_ctime;   /* time of last status change - */    
16 };  

st_mode是用特征位来表示文件类型以及操作权限的,特征位的定义如下:

 1 S_IFMT      0170000     文件类型的位遮罩
2 S_IFSOCK 0140000 socket
3 S_IFLNK 0120000 符号链接(symbolic link)
4 S_IFREG 0100000 一般文件
5 S_IFBLK 0060000 区块装置(block device)
6 S_IFDIR 0040000 目录
7 S_IFCHR 0020000 字符装置(character device)
8 S_IFIFO 0010000 先进先出(fifo)
9 S_ISUID 0004000 文件的(set user-id on execution)位
10 S_ISGID 0002000 文件的(set group-id on execution)位
11 S_ISVTX 0001000 文件的sticky位
12 S_IRWXU 00700 文件所有者的遮罩值(即所有权限值)
13 S_IRUSR 00400 文件所有者具可读取权限
14 S_IWUSR 00200 文件所有者具可写入权限
15 S_IXUSR 00100 文件所有者具可执行权限
16 S_IRWXG 00070 用户组的遮罩值(即所有权限值)
17 S_IRGRP 00040 用户组具可读取权限
18 S_IWGRP 00020 用户组具可写入权限
19 S_IXGRP 00010 用户组具可执行权限
20 S_IRWXO 00007 其他用户的遮罩值(即所有权限值)
21 S_IROTH 00004 其他用户具可读取权限
22 S_IWOTH 00002 其他用户具可写入权限
23 S_IXOTH 00001 其他用户具可执行权限

POSIX定义了下面几种通过st_mode判断文件类型的宏:

1 The following POSIX macros are defined to check the file type using the st_mode field:
2 S_ISREG(m)  /* is it a regular file? -普通文件 */
3 S_ISDIR(m)  /* directory? -目录文件? */
4 S_ISCHR(m)  /* character device? -字符设备文件? */
5 S_ISBLK(m)  /* block device? -块设备文件? */
6 S_ISFIFO(m) /* FIFO (named pipe)? -管道文件? */
7 S_ISLNK(m)  /* symbolic link? (Not in POSIX.1-1996.) -符号链接? */
8 S_ISSOCK(m) /* socket? (Not in POSIX.1-1996.) -套接口? */

1. stat()获取文件相关信息

 #include <stdio.h>
#include <stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h> int main(int argc, char **argv)
{
struct stat buf;
if(argc != ) {
printf("Usage: stat ");
exit(-);
}
if(stat(argv[], &buf) != ) {
printf("stat error.");
exit(-);
}
printf("#i-node: %ld\n", buf.st_ino);
printf("#link: %d\n", buf.st_nlink);
printf("UID: %d\n", buf.st_uid);
printf("GID: %d\n", buf.st_gid);
printf("Size %ld\n", buf.st_size);
exit();
}

2. 实现Linux ls命令

 #include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h> char gettype(mode_t mod)
{
/*
if( S_ISREG(mod) ) return '-';
if( S_ISDIR(mod) ) return 'd';
if( S_ISCHR(mod) ) return 'c';
if( S_ISBLK(mod) ) return 'b';
if( S_ISLNK(mod) ) return 'l';
if( S_ISSOCK(mod) ) return 's';
if( S_ISFIFO(mod) ) return 'p';
*/
switch(mod & S_IFMT)
{
case S_IFSOCK: return 's';
case S_IFREG: return '-';
case S_IFCHR: return 'c';
case S_IFBLK: return 'b';
case S_IFLNK: return 'l';
case S_IFIFO: return 'p';
case S_IFDIR: return 'd';
}
} char *getperm(mode_t mod)
{
static char buf[]; int i = ;
while(i--)
{
if(mod & <<i)
{
switch((-i)%)
{
case : buf[-i] = 'r'; break;// r/w/x;
case : buf[-i] = 'w'; break;// r/w/x;
case : buf[-i] = 'x'; break;// r/w/x;
}
}
else
buf[-i] = '-';
} return buf;
} char *getttt(time_t *t)
{
static char buf[]; strncpy(buf, ctime(t), ); return buf;
} int main(int argc, char **argv)
{
DIR *dp = opendir((==argc)?argv[]:"."); if( == argc)
chdir(argv[]); struct dirent *p; struct stat s;
while( p = readdir(dp) )
{
if(- == stat(p->d_name, &s) )
{
perror("stat");
return -;
} printf( "%c%s %5d %s %s %10ld %s\033[1;31;40m %s \033[0m\n",
gettype(s.st_mode),
getperm(s.st_mode),
s.st_nlink,
getpwuid(s.st_uid)->pw_name,
getgrgid(s.st_gid)->gr_name,
s.st_size,
getttt(&s.st_mtime),
p->d_name );
}
}

stat(),lstat(),fstat() 获取文件/目录的相关信息的更多相关文章

  1. os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息

    import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...

  2. C#开发BIMFACE系列8 服务端API之获取文件上传状态信息

    系列目录     [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...

  3. AD命令获取计算机、用户相关信息

    1. 获取AD用户相关信息(用户名.创建日期.最后修改密码日期.最后登录日期) Get AD users, Name/Created Date/Last change passwd Date/Last ...

  4. 第九篇:使用 lstat 函数获取文件信息

    前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个 ...

  5. 使用 lstat 函数获取文件信息

    前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个 ...

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

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

  7. android 获取 imei号码 及相关信息

    android 获取 imei号码 参考:http://www.cnblogs.com/luxiaofeng54/archive/2011/03/01/1968063.html 核心代码: Imei ...

  8. asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)

    // 注意:首先要在项目bin目录中添加引用 System.Management using System;using System.Collections.Generic;using System. ...

  9. iOS获取运营商的相关信息

    1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import ...

随机推荐

  1. C#。5 结构体

    结构体:相当于是我们自己定义的一种复杂的类型. 常见简单类型:int...  double float bool char string 常见复杂类型:DateTime  数组类型 生活中大部份的对象 ...

  2. css快捷方式

    本来是年前准备整理发布的,都搞定50%了,一篇万恶的<盗墓笔记:九幽将军>让我猪油蒙了心.....诶,不说了,搞一半就算了,最后还忘了保存,此刻只听得那一万只草某马呼啸而过... 言归正传 ...

  3. Js 插件修改及优化总结

    1. ajaxfileupload 上传插件版本问题以及数据处理问题 参考链接: http://liwx2000.iteye.com/blog/1540321 现在大家至少也在用jquery1.9以上 ...

  4. Activity一共有以下四种launchMode

    1. standard: 无论什么情况都会生成一个新的Activity实例,并且放于栈顶. 2. singleTop:如果Activity纯在但是不位于栈顶,就重新生成一个Activity实例. 3. ...

  5. javascript 操作 css Rule

    //add addCssRule('.bcd',{'color':'red','font-weight':'bold','font-size':'12px'},document.styleSheets ...

  6. swt

    http://blog.sina.com.cn/s/blog_557ebb4c0101mgtc.html http://blog.csdn.net/kagoy/article/details/1746 ...

  7. POJ1850 组合数学

    POJ1850 问题重述: 用26个小写字母进行编码,编码规则如下: 1)每个编码中前一个字母必须小于后一个字母 2)编码按照长度从小到大排列,相同长度按字典序进行排列 输入一个字母串,求解该编码对应 ...

  8. Lua 学习笔记(二)

    七.再论lua函数 1.lua中的函数被认为是带有词法定界和第一类值    a.词法定界:被嵌套的函数可以访问外部函数的变量    b.第一类值: lua中的函数可以放在变量中    (函数指针?) ...

  9. Python 坑爹之 代码缩进

    建议:统一使用空格!!!!!!!!!不要Tab Python代码缩进   这两天python-cn邮件列表有一条thread发展的特别长,题目是<python的代码缩进真是坑爹>(地址), ...

  10. android获取屏幕宽高与获取控件宽高

    获取屏幕宽高 // 获取屏幕宽高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素 ...