20230801

1.从终端获取一个文件名。

2.若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹

3.若该文件不是目录文件,则显示

#include <head.h>


//看文件类别
char getflietype(mode_t m);
//看权限"rwx"

void getfilepermission(mode_t m);
//ino_t 号
int getfileinot(ino_t ino);
//硬链接数
void getfilenlinkt(nlink_t n);
//用户的uid
char *getusrname(uid_t uid);
//文件大小off_t
int getofft(off_t size);
//时间
void gettime(time_t t);
//组用户的gid
char *getgrpname(gid_t gid);

//读取文件名
char *getfilename(char *name);

void getname(char *s1);
--------------------------------------
#include "heead.h"

//看文件类别
char getflietype(mode_t m)
{
	char mode;
	switch(m & S_IFMT)
	{
		case S_IFBLK:  mode = 'b'; break; 
		case S_IFCHR:  mode = 'c'; break; 
		case S_IFDIR:  mode = 'd'; break; 
		case S_IFIFO:  mode = 'p'; break; 
		case S_IFLNK:  mode = 'i'; break; 
		case S_IFREG:  mode = '-'; break; 
		case S_IFSOCK: mode = 's'; break; 
		default:       printf("unknown\n"); break;
	}
	return mode;
}
//看权限"rwx"
void getfilepermission(mode_t m)
{
	char buf[] = "rwx";
	int i;
	for(i=0;i<9;i++)
	{
		if ((m & (0400)>>i) == 0)
		{
			putchar('-');
			continue;
		}

		printf("%c",buf[i%3]);
	}
	printf(" ");
}
//ino_t 号
int getfileinot(ino_t ino)
{
	int n1;
	n1 = ino;
	return n1;
}

//硬链接数
void getfilenlinkt(nlink_t n)
{
	printf("%ld ",n);
}

//用户的uid
char *getusrname(uid_t uid)
{
	char s1[20];
	char *p = s1;
	struct passwd* usr = getpwuid(uid);
	if(NULL == usr)
	{
		perror("getpwuid");
		return NULL;
	}
	strcpy(p,usr->pw_name);
	return p;
}

//组用户的gid
char *getgrpname(gid_t gid)
{
	char s2[20];
	char *p = s2;
	struct group* gr = getgrgid(gid);
	if(NULL == gr)
	{
		perror("getgrpname");
		return NULL;
	}
	strcpy(p,gr->gr_name);
	return p;
}

//文件大小off_t
int getofft(off_t size)
{
	int k1 = size;
	return k1;
}

//时间
void gettime(time_t t)
{
	time(&t);
	struct tm* info = NULL;
	info = localtime(&t);
	printf("%4d-%02d-%02d %02d:%02d:%02d\r",\
			info->tm_year+1900,info->tm_mon+1,info->tm_mday,\
			info->tm_hour,info->tm_min,info->tm_sec);
	
	fflush(stdout);
	sleep(1);
	printf("\n");
}
char *getfilename(char *name)
{
	char s[20];
	char *p = s;
	strcpy(p,name);
	printf("%s ",p);
	return p;
}


void getname(char *s1)
{
	int b = strlen(s1);
	printf("b= %d\n",b);
	int k=0;
	char s2[20];
	char *p = s2;
	int j,r;
	for(j=b;j <= b;j--)
	{
		if(*(s1+j) == '/')
		{
			break;
		}
		//printf("%c ",*(s1+j));
	}
	for(r=j+1,k=0;r<=b;r++,k++)
	{
		printf("%c ",*(s1+r));
		*(p+k) = *(s1+r);
	}
	printf(" ");
//	*(p+k+1) = '\0';
}
---------------------------------------
#include "heead.h"

int main()
{
	//获取文件属性
	char s1[40] = "";;
	printf("输入文件路径名:");
	scanf("%s",s1);
	struct stat buf;
	int k = stat(s1,&buf);
	if(k < 0)
	{
		perror("error\n");
		return 0;
	}
	printf("Mode = %o\n",buf.st_mode);
	//对比权限类别d为目录文件
	char mode;
	char *uidname = NULL;
	char *gidname = NULL;
	char *filename = NULL;
	char rwx[10] = "";
	int k1=0;
	int n1=0;
	time_t t1;
	mode = getflietype(buf.st_mode);
	if(mode != 'd')//目录文件
	{	
	
		printf("该文件为非目录文件\n");
		getname(s1);//文件名
		getfilepermission(buf.st_mode);//权限rwx
		n1 = getfileinot(buf.st_ino);//ino_t号
		mode = getflietype(buf.st_mode);//文件类别
		uidname = getusrname(buf.st_uid);//用户uid
		gidname = getgrpname(buf.st_gid);//组用户gid
		k1 = getofft(buf.st_size);//文件大小size*/
		printf("%s %d %c %s %s %d ",filename,n1,mode,uidname,gidname,k1);
		gettime(t1);
	}
	else//非目录文件
	{
		
		printf("该文件为目录文件\n");
		//stat(s1,&buf);
		DIR* dp = opendir(s1);
		if(NULL == dp)
		{
			perror("error\n");
			return -1;
		}
			struct dirent* rp = NULL;
		while(1)
		{
			rp = readdir(dp);
			if(NULL == rp)
			{
				printf("目录读取完毕\n");
				break;
			}
			if(*(rp->d_name) != '.')
			{
				filename = getfilename(rp->d_name);//文件名
				getfilepermission(buf.st_mode);//权限rwx
				n1 = getfileinot(buf.st_ino);//ino_t号
				mode = getflietype(buf.st_mode);//文件类别
				uidname = getusrname(buf.st_uid);//用户uid
				gidname = getgrpname(buf.st_gid);//组用户gid
				k1 = getofft(buf.st_size);//文件大小size*/
				printf("%s %d %c %s %s %d ",filename,n1,mode,uidname,gidname,k1);
				gettime(t1);

				rp = rp->d_name;
			}
		}
	}


	return 0;
}
-----------------------------------------------
输入文件路径名:/home/ubuntu/hqyj/HQYJ/IO/D4/z1/k1.c
Mode = 100664
该文件为非目录文件
k 1 . c   rw-rw-r-- (null) 528922 - ubuntu ubuntu 1765 2023-08-01 23:19:57

ubuntu@ubuntu:z1$ ./a.out
输入文件路径名:/home/ubuntu/hqyj/HQYJ/IO/D4/z1
Mode = 40775
该文件为目录文件
a.out rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:16
test1.c rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:17
k1.c rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:18
heead.h rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:19
core rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:20
heead.h.gch rwxrwxr-x ubuntu 528878 d ubuntu ubuntu 4096 2023-08-01 23:20:21
目录读取完毕

该文件的属性到终端上,类似ls-这单个文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值