IO STAT获取文件属性

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
#include <string.h>
#include <grp.h>
#include <time.h>
#include <stdlib.h>

//获取文件权限
void get_filemode(mode_t m,char arr[10])
{
	int i,p = 0400;
	char brr[4] = "rwx";
	for(i=0;i<9;i++){
		if((m&(p>>i))==0){
			arr[i] = '-';
			continue;
		}
		arr[i] = brr[i%3]; 
	}
	printf("%s ",arr);
}

//获取文件类型
void get_filetype(mode_t m)
{
	if(S_ISREG(m)){
		putchar('-');
	}
	if(S_ISDIR(m)){
		putchar('d');
	}
	if(S_ISCHR(m)){
		putchar('c');
	}
	if(S_ISBLK(m)){
		putchar('b');
	}
	if(S_ISFIFO(m)){
		putchar('p');
	}
	if(S_ISLNK(m)){
		putchar('l');
	}
	if(S_ISSOCK(m)){
		putchar('s');
	}
	return;
}

//获取当前文件用户名
void get_fileUname(uid_t uid)
{
	struct passwd* name;
	name = getpwuid(uid);
	if(name==NULL){
		perror("getpwuid");
		return ;
	}
	char arr[20] = "";
	strcpy(arr,name->pw_name);
	printf("%s ",arr);
	return ;
}

//获取文件所属组用户名
void get_fileGname(gid_t gid)
{
	struct group* name;
	name = getgrgid(gid);
	if(name == NULL){
		perror("getgrgid");
		return ;
	}
	char arr[20] = "";
	strcpy(arr,name->gr_name);
	printf("%s ",arr);
}

//获取文件时间戳
void get_filetime(time_t time)
{
	struct tm* p = NULL;
	p = localtime(&time);
	switch(p->tm_mon+1){
	case 1:
		printf("一 ");
		break;
	case 2:
		printf("二 ");
		break;
	case 3:
		printf("三 ");
		break;
	case 4:
		printf("四 ");
		break;
	case 5:
		printf("五 ");
		break;
	case 6:
		printf("六 ");
		break;
	case 7:
		printf("七 ");
		break;
	case 8:
		printf("八 ");
		break;
	case 9:
		printf("九 ");
		break;
	case 10:
		printf("十 ");
		break;
	case 11:
		printf("十一 ");
		break;
	case 12:
		printf("十二 ");
		break;

	}
	printf(" %d %d:%d ",p->tm_mday,p->tm_hour,
			p->tm_min);
	return ;
}





int main(int argc, const char *argv[])
{
	struct stat buf;
	if(stat(argv[1],&buf)){
		perror("stat");
		return -1;
	}

	//文件类型及权限
	//	printf("mode = %o\n",buf.st_mode);
	char arr[10] = "";
	get_filetype(buf.st_mode);
	get_filemode(buf.st_mode,arr);

	//文件硬链接个数
	printf("%ld ",buf.st_nlink);

	//文件当前用户
	get_fileUname(buf.st_uid);

	//文件所属组用户
	get_fileGname(buf.st_gid);

	//文件大小
	printf("%ld ",buf.st_size);

	//文件时间戳
	get_filetime(buf.st_atim.tv_sec);

	//文件名
	printf("%s\n",argv[1]);

	return 0;
}

运行示例 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值