day4

从终端获取一个文件的路径以及名字
若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls-l该文件夹
若该文件不是目录文件,则显示该文件的属性显示到终端上,类似ls-l这单个文件
//主函数
#include "top.h"
int main(int argc, const char *argv[])
{
	//从终端获取一个文件的路径及名字
	printf("please enter a path(must enter / at the end of path):\n");
	char getpath[30]="";
	char path[50]="";
	scanf("%s",getpath);
	//获取路径文件信息
	struct stat mes;
	int f=stat(getpath,&mes);
	if(f<0)
	{
		ERR_MSG("stat");
		return -1;
	}
	//判断是否是目录文件
	if((mes.st_mode&S_IFMT)==S_IFDIR)
	{
		//打开该目录
		DIR *dp=opendir(getpath);
		if(NULL==dp)
		{
			ERR_MSG("opendir");
			return -1;
		}
		else
			printf("dir has been opened\n");
		struct dirent *dirmess=NULL;

		//循环读取目录文件信息
		while(1)
		{
			dirmess=readdir(dp);
			if(NULL== dirmess)
			{
				printf("read finished\n");
				break;
			}
			strcpy(path,getpath);
			strcat(path,dirmess->d_name);
			OutPut_message(path);
		}
		//关闭目录
		if((closedir(dp))<0)
		{
			ERR_MSG("closedir");
			return -1;
		}
		printf("dir has been closed\n");
		return 0;
	}
	//判断是否是普通文件
	else if((mes.st_mode&S_IFMT)==S_IFREG)
	{
		//输出普通文件信息
		OutPut_message(getpath);	
		return 0;
	}
	//判断为其他文件
	else 
	{
		printf("can't read from this path\n");
		return -1;
	}
	return 0;
}
//头文件
#ifndef __HEAD_H2__
#define __HEAD_H2__
#include 
void Transform_Mode(int mode);
void Transform_type(int mode);
void Transform_name(gid_t GID,uid_t UID);
void Transform_Time(time_t *timebysec);
void OutPut_message(char *filename);
#endif
//子函数
#include "top.h"
//文件权限转化
void Transform_Mode(int mode)
{
	int f=0400;	
	int count=0;
	while(f!=0)
	{	
		if(count==3)
			count=0;
		if((mode & f)!=0)
		{
			switch(count)
			{
			case 0:putchar('r');break;
			case 1:putchar('w');break;
			default:putchar('x');break;
			}
		}
		else
			putchar('-');
		f=f>>1;
		count++;
	}
}
//文件类型转化
void Transform_type(int mode)
{
	if(S_ISREG(mode))
		putchar('-');
	else if(S_ISDIR(mode))
		putchar('d');
	else if(S_ISCHR(mode))
		putchar('c');
	else if(S_ISBLK(mode))
		putchar('b');
	else if(S_ISFIFO(mode))
		putchar('p');
	else if(S_ISLNK(mode))
		putchar('l');
	else if(S_ISSOCK(mode))
		putchar('s');
}

//文件修改时间转化
void Transform_Time(time_t *timebysec)
{
	struct tm *t=NULL;
	t=localtime(timebysec);
	switch(t->tm_mon)
	{
		case 0:printf("一月 ");break;
		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;
	}
	printf("%02d %02d:%02d",t->tm_mday,\
			t->tm_hour,t->tm_min);
}

//用户名及所属组用户转换
void Transform_name(gid_t GID,uid_t UID)
{
	struct group *GG = getgrgid(GID);
	struct passwd *UU = getpwuid(UID);
	printf("%s ",UU->pw_name);
	printf("%s ",GG->gr_name);

}
//输出普通文件信息
void OutPut_message(char *filename)
{
	struct stat mes;
	int f=stat(filename,&mes);
	if(f!=0)
	{
		printf("OutPut_message error\n");
		return;
	}
	Transform_type(mes.st_mode);
	Transform_Mode(mes.st_mode);
	printf(" %ld ",mes.st_nlink);
	Transform_name(mes.st_gid,mes.st_uid);
	printf("%5ld ",mes.st_size);
	Transform_Time(&mes.st_mtime);
	printf(" %s\n",filename);
}

day4_第1张图片

 

你可能感兴趣的:(c语言)