22.11.9 IO Day3 命令行打印文件属性

 1.打印文件属性

ubuntu@ubuntu:~/yuyu/yu/1/4$ gcc 16.c
ubuntu@ubuntu:~/yuyu/yu/1/4$ ./a.out
-rw-r--r--  1 ubuntu ubuntu    16  11- 8 14: 0 fwrite.c
drwxr-xr-x  5 ubuntu ubuntu  4096  11- 8  9:50   ..
-rw-r--r--  1 ubuntu ubuntu   679  11- 9  9: 1 11.c
-rw-r--r--  1 ubuntu ubuntu   546  11- 8 19:51  9.c
-rw-r--r--  1 ubuntu ubuntu   621  11- 8 13:59  2.c
-rwxr-xr-x  1 ubuntu ubuntu 13192  11- 9 20:30 a.out
-rwxr-xr-x  1 ubuntu ubuntu   411  11- 9 19:31 copy.c
-rw-r--r--  1 ubuntu ubuntu  3816  11- 9 20:30 16.c
-rw-r--r--  1 ubuntu ubuntu   684  11- 9 11:57 13.c
-rw-r--r--  1 ubuntu ubuntu   744  11- 9 17: 4 10.c
-rw-r--r--  1 ubuntu ubuntu   420  11- 8 17:19  4.c
-rw-r--r--  1 ubuntu ubuntu   786  11- 9 19: 7 17.c
-rw-r--r--  1 ubuntu ubuntu   783  11- 9 17:20 15.c
-rw-r--r--  1 ubuntu ubuntu   411  11- 8 11:59  1.c
-rw-r--r--  1 ubuntu ubuntu   713  11- 9 14: 0 12.c
-rw-r--r--  1 ubuntu ubuntu  1281  11- 9 16: 2 14.c
-rw-r--r--  1 ubuntu ubuntu   435  11- 8 14:47  3.c
-rw-r--r--  1 ubuntu ubuntu     0  11- 8 16:28 1.txt
-rw-r--r--  1 ubuntu ubuntu   805  11- 9 19:31 18.c
-rw-r--r--  1 ubuntu ubuntu   169  11- 8 17: 6  7.c
drwxr-xr-x  2 ubuntu ubuntu  4096  11- 9 20:30    .
-rwxr-xr-x  1 ubuntu ubuntu    20  11- 9 11:57 write.txt
-rw-r--r--  1 ubuntu ubuntu   144  11- 8 19:57 time1.txt
-rw-r--r--  1 ubuntu ubuntu  1305  11- 8 19:22  8.c
-rw-r--r--  1 ubuntu ubuntu   441  11- 8 16:24  5.c
-rw-r--r--  1 ubuntu ubuntu  2398  11- 8 19:42 time.txt
-rw-r--r--  1 ubuntu ubuntu   598  11- 8 17: 7  6.c
目录读取结束
ubuntu@ubuntu:~/yuyu/yu/1/4$ cat 16.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//将文件权限转化为字符'rwx-'
void file_chmod(mode_t m)
{
	int i;
	for(i=0;i<9;i++)
	{
		if((m & (0400>>i)) ==0)//100 000 000
		{
			putchar('-');
			continue;
		}
		switch(i)
		{
		case 0:
		case 3:
		case 6:
			putchar('r');
			break;
		case 1:
		case 4:
		case 7:
			putchar('w');
			break;
		case 2:
		case 5:
		case 8:
			putchar('x');
			break;                  
		}
	}
}
//将文件类型转化为字符'bcd-lsp'
#if 1
void file_typee(mode_t m)
{
	switch(m&S_IFMT)//S_IFMT:0170000 ->001 111 000 000 000 000
	{                       
	case S_IFSOCK:
		putchar('s');
		break;
	case S_IFLNK:
		putchar('l');
		break;
	case S_IFREG:
		putchar('-');
		break;
	case S_IFBLK:
		putchar('b');
		break;
	case S_IFDIR:
		putchar('d');
		break;
	case S_IFCHR:
		putchar('c');
		break;
	case S_IFIFO:
		putchar('p');
		break;
	}
}
#endif
#if 0
char get_fileType(mode_t m)
{
	char c = 0;
	if(S_ISREG(m)){
		putchar('-');
		c = '-';
	}
	else if(S_ISDIR(m)){
		putchar('d');
		c = 'd';
	}
	else if(S_ISCHR(m)){
		putchar('c');
		c = 'c';
	}
	else if(S_ISBLK(m)){
		putchar('b');
		c = 'b';
	}
	else if(S_ISFIFO(m)){
		putchar('p');
		c = 'p';
	}
	else if(S_ISLNK(m)){
		putchar('l');
		c = 'l';
	}
	else if(S_ISSOCK(m)){
		putchar('s');
		c = 's';
	}
	return c;
}
#endif
//将用户UID转化为ubuntu字符形式
#if 1
void file_username(uid_t uid)             
{
	struct passwd * pwd=getpwuid(uid);
	if(NULL==pwd)
	{
		perror("pwd");
		return ;
	}
	printf("%s ",pwd->pw_name);
}
#endif
//提取文件所属用户名
#if 0
char* get_pwdname(uid_t uid, char* ptr) //uid = buf.st_uid
{
	struct passwd* pwd = getpwuid(uid);
	if(NULL == pwd)
	{
		perror("getpwuid");
		return NULL;
	}
	strcpy(ptr, pwd->pw_name);
	return ptr;
}
#endif
//将用户组ID转化为字符形式
#if 1
void file_groupname(gid_t gid)
{
	struct group * grp=getgrgid(gid);
	if(NULL==grp)
	{
		perror("grp");
		return ;
	}
	printf("%s ",grp->gr_name);
}
#endif
//提取文件所属组用户名跟
#if 0
char* get_grname(gid_t gid, char* ptr)
{
	struct group* grp = getgrgid(gid);
	if(NULL == grp)
	{
		perror("getgrgid");
		return NULL;
	}
	strcpy(ptr, grp->gr_name);
	return ptr;
}
#endif
//将时间戳转化为"年月日,时分"形式
void file_time(time_t t)
{
	struct tm *lp=localtime(&t);
	if(NULL==lp)
	{
		perror("time");
		return;
	}
	printf("  %2d-%2d %2d:%2d ",\
			lp->tm_mon+1,lp->tm_mday,\
			lp->tm_hour,lp->tm_min);
}

int main(int argc, const char *argv[])
{
	//打开目录文件
	DIR *dp=opendir("./");
	if(NULL==dp)
	{
		perror("opendir");
		return -1;
	}
	//读取目录文件
	while(1)
	{
		struct dirent *pp=readdir(dp);
		if(NULL==pp)
		{
			if(errno==0)
			{
				printf("目录读取结束\n");
				break;
			}
			else
			{
				perror("readdir");
				return -1;
			}

		}
		/*	if((pp->d_name)[0]!='.')
			{
			printf("%s\n",pp->d_name);//输出目录中的文件
			}
			*/
		struct stat buf;//申请空间
		//将输出的文件路径传入打印文件属性的结构体中
		int ret=stat(pp->d_name,&buf);
		if(ret<0)
		{
			perror("stat");
			return -1;
		}

		//文件类型及权限
		file_typee(buf.st_mode);
		file_chmod(buf.st_mode);

		//硬链接
		printf("  %ld ",buf.st_nlink);

		//UID
		file_username(buf.st_uid);
//char* get_pwdname(uid_t uid, char* ptr); //uid = buf.st_uid

		//GID
	    file_groupname(buf.st_gid);
//char* get_grname(gid_t gid, char* ptr);

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

		//时间戳
		time_t m=buf.st_ctime;
		file_time(m);

		//文件名
		printf("%4s\n",pp->d_name);

	}
	//关闭目录文件
	if(closedir(dp)<0)
	{
		perror("closedir");
		return -1;
	}

	return 0;
}
ubuntu@ubuntu:~/yuyu/yu/1/4$ 

你可能感兴趣的:(C基础,ubuntu,linux,java)