LINUX获取文件信息
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,获取对应信息
|
||
|
文件类型mode存的是一个无符号短整型,一个无符号短整型占2个字节,16位,中12位是存权限位,有三位?;
//stat.c
// %5x buf.st_mode
//现在要做的就是把得到的十六进制的st_mode转换成ls -l最开头的那种形式。
剩下的4位是用来存文件类型,这就是LINUX只能有16中文件类型
| man stat , 查看里面的宏定义 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获取文件信息的更多相关文章
- 【转】linux C++ 获取文件信息 stat函数详解
stat函数讲解 表头文件: #include <sys/stat.h> #include <unistd.h>定义函数: int stat ...
- Linux获取网络接口信息
linux获取网络接口信息需要用到的函数为ioctl(),结构体struct ifreq,struct ifconf 1.ioctl()函数原型及作用 #include <sys/ioctl.h ...
- FastDFS 通过文件名获取文件信息
/** * 获取文件信息 * * param string group_name 文件所在的组名 * param string file_id 文件id(如: M00/09/BE/rBBZolgj6O ...
- C# -- 使用FileInfo获取文件信息
C# -- 使用FileInfo获取文件信息 1. 代码实现 static void Main(string[] args) { GetFileInfo(@"D:\Test.xlsx&quo ...
- C#中获取文件信息的代码
如下的内容内容是关于C#中获取文件信息的内容,应该对大伙有一些好处. FileInfo fi = new FileInfo(@"C:file.txt"); if(fi.Exists ...
- C#开发BIMFACE系列6 服务端API之获取文件信息
在<C#开发BIMFACE系列4 服务端API之源上传文件>.<C#开发BIMFACE系列5 服务端API之文件直传>两篇文章中详细介绍了如何将本地文件上传到BIMFACE服务 ...
- C#开发BIMFACE系列7 服务端API之获取文件信息列表
系列目录 [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...
- 拖放获取文件信息的bat代码
参考:岁月如歌-通过拖曳获取文件信息的bat代码 拖放获取文件信息的bat代码 使用命令行配合7z解压文件时由于每次解压的文件不同,因此搜索了一下拖放识别文件信息的方法,以此方式来减轻工作量 获取文件 ...
- linux 获取文件系统信息(磁盘信息)
源代码例如以下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <s ...
随机推荐
- Erlang/OTP设计原则(文档翻译)
http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1. 这个设计原则,其实 ...
- 什么是CDN加速?(转载)
随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激增,网络访问路径过长,从 而使用户的访问质量受到严重影响.特别是当用户与网站之间的链路被突发的大流量数据拥塞时,对于异 ...
- mac上安装mongodb数据库教程
1.官网下载压缩包,并解压到当地任一目录.(我的是Documents/develop/mongodb) 2.在mongodb下新建data文件夹,在data下新建db文件夹.(bin和data文件夹在 ...
- 在mac下使用终端命令通过ssh协议连接远程linux系统,代替windows的putty
指令:ssh username@server.address.com 事例:wangmingdeMacBook-Pro:~ xxxxxxxxxx$ ssh root@XXXX.net The auth ...
- 【批处理学习笔记】第十三课:常用dos命令(3)
网络命令ping 进行网络连接测试.名称解析ftp 文件传输net 网络命令集及用户管理telnet 远程登陆ipconfig显示.修改TCP/IP设置msg 给用户发送消息arp 显示.修改局域网的 ...
- c语言中标识符的作用域
1.代码块作用域(block scope) 位于一对花括号之间的所有语句称为一个代码块,在代码块的开始位置声明的标识符具有代码块作用域,表示它们可以被这个代码中的所有语句访问.函数定义的形式参数在函数 ...
- Linux中git的使用
之前在windows中一直采用github的桌面版,库的建立更新都是借助软件的帮助.所使用的的功能也非常局限,仅仅只是创建库再提交自己的代码.至于版本管理.回滚.分支以及git的结构都没有清楚的认识. ...
- 设置Sql server用户对表、视图、存储过程、架构的增删改查权限
根据数据库Schema限制用户对数据库的操作行为 授予Shema dbo下对象的定义权限给某个用户(也就是说该用户可以修改架构dbo下所有表/视图/存储过程/函数的结构) use [Your DB N ...
- C#采用rabbitMQ搭建分布式日志系统
网上对于java有很多开源的组件可以搭建分布式日志系统,我参考一些组件自己开发一套简单的分布式日志系 全部使用采用.NET进行开发,所用技术:MVC.EF.RabbitMq.MySql.Autofac ...
- Oracle_建表
Oracle_建表 --设计要求: --建立一张用来存储学生信息的表 --字段包含学号.姓名.性别,年龄.入学日期.班级,email等信息 create table student( ...