stat(),lstat(),fstat() 获取文件/目录的相关信息
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() 获取文件/目录的相关信息的更多相关文章
- os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息
import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...
- C#开发BIMFACE系列8 服务端API之获取文件上传状态信息
系列目录 [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...
- AD命令获取计算机、用户相关信息
1. 获取AD用户相关信息(用户名.创建日期.最后修改密码日期.最后登录日期) Get AD users, Name/Created Date/Last change passwd Date/Last ...
- 第九篇:使用 lstat 函数获取文件信息
前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个 ...
- 使用 lstat 函数获取文件信息
前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个 ...
- linux 获取文件系统信息(磁盘信息)
源代码例如以下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <s ...
- android 获取 imei号码 及相关信息
android 获取 imei号码 参考:http://www.cnblogs.com/luxiaofeng54/archive/2011/03/01/1968063.html 核心代码: Imei ...
- asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)
// 注意:首先要在项目bin目录中添加引用 System.Management using System;using System.Collections.Generic;using System. ...
- iOS获取运营商的相关信息
1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import ...
随机推荐
- Java基础知识强化68:基本类型包装类之Character概述和Character常见方法
1. Character概述: public final class Character extends Object implements Serializable,Comparable<Ch ...
- 关于ubuntu中的软件安装
在ubuntu中一般使用apt-get来安装软件工具, 例如 sudo apt-get install g++ apt-get会在镜像库中找到你需要的软件镜像(例如 g++)来安装,那么apt-get ...
- 关于textbox.attributes["value"]的问题
在“修改”时,出现这个问题,后台点击修改时,应该是文本框出现一些初始值 BLL.manager bll = new BLL.manager(); Model.manager model = bll.G ...
- notification:object not locked by thread before notify()
今天写notification练习时,误将NotificationManager.notify(0, notification);写成notification.notify(); 代码如下 publi ...
- poj1418 Viva Confetti 判断圆是否可见
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Viva Confetti Time Limit: 1000MS Memory ...
- (原)python使用ctypes调用C/C++接口
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6135514.html 参考网址: https://docs.python.org/2/library/ ...
- Turtle库
下列turtle库的简单常用指令 forward(distance) #将箭头移到某一指定坐标 left(angel) right(angel) penup() #提起笔,用于另起一个地方绘制时 ...
- 文成小盆友python-num6 -反射 ,常用模块
本次主要内容: 内容补充 python中的反射 常用模块 一,内容补充: 利用上次说到的递归的方法来实现阶乘. 说明:利用函数递归的方法来实现阶乘如: 1*2*3*4*5*6*7 代码实现如下: de ...
- JS 闭包问题
一.什么是闭包?“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相信很少有人能直接看懂这句话,因为他描述的太 ...
- Caffe : Layer Catalogue(1)
原文:http://caffe.berkeleyvision.org/tutorial/layers.html 参考:http://blog.csdn.net/u011762313/article/d ...