实现ls -l 功能,index,rindex函数的使用

这篇文章介绍了如何使用C语言中的`stat`函数获取文件属性信息,包括文件类型、权限、硬链接数、所属用户和组等。同时展示了如何遍历目录并递归调用`do_ls_file`处理文件,以及在`do_ls_dir`中使用`opendir`和`readdir`进行目录遍历。
摘要由CSDN通过智能技术生成

index(); rindex();-----------------------------------------------------------------

index第一次遇到字符c,rindex最后一次遇到字符c,返回值都是从那个位置开始往后的字符串地址

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

int do_ls_file(const char *filename)
{
	//stat --获取文件属性信息 
	struct stat st;

	if (stat(filename,&st) < 0) //"Music" stat("./Music",&st) //"~/Music"
	{
		perror("stat fail");
		return -1;
	}

	//1.打印 文件类型
    switch(st.st_mode & S_IFMT)
	{
		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_IFCHR:
			putchar('c');
			break;
		case S_IFIFO:
			putchar('p');
			break;
		case S_IFDIR:
			putchar('d');
			break;
		default:
			putchar('?');
			break;
	}
	//2.文件权限 
	st.st_mode&S_IRUSR?putchar('r'):putchar('-');	
	st.st_mode&S_IWUSR?putchar('w'):putchar('-');	
	st.st_mode&S_IXUSR?putchar('x'):putchar('-');	
	
	st.st_mode&S_IRGRP?putchar('r'):putchar('-');	
	st.st_mode&S_IWGRP?putchar('w'):putchar('-');	
	st.st_mode&S_IXGRP?putchar('x'):putchar('-');	
	
	st.st_mode&S_IROTH?putchar('r'):putchar('-');	
	st.st_mode&S_IWOTH?putchar('w'):putchar('-');	
	st.st_mode&S_IXOTH?putchar('x'):putchar('-');	
	//3.硬链接数
	printf(" %ld",st.st_nlink);
	//4.所属用户 
	printf(" %s",getpwuid(st.st_uid)->pw_name);
	//5.所属组
	printf(" %s",getgrgid(st.st_gid)->gr_name);
	//6.大小 
	printf(" %ld",st.st_size);
	//7.最后修改时间 
    struct tm *ptm = localtime(&st.st_mtime);	
	printf(" %02d月%02d %02d:%02d",ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min);
	//8.名字
	printf(" %s\n",rindex(filename,'/')+1);  //filename是人为加上带路径的文件名
	
	return 0;
}


int do_ls_dir(const char *dirname)
{
	DIR *dir = opendir(dirname);
	if (dir == NULL)
	{
		perror("opendir fail");
		return -1;
	}

	struct dirent *pdir = NULL;

	while (pdir=readdir(dir))
	{

//		printf("name = %s\n",pdir->d_name); //"Music"
		char path[1024] = {0};
		
		// "~"
		// "~/" 
		if(pdir->d_name[0] != '.')
		{
			dirname[strlen(dirname)-1] == '/'?sprintf(path,"%s%s",dirname,
                      pdir->d_name):sprintf(path,"%s/%s",dirname,pdir->d_name);
			//带了路径的文件名

			do_ls_file(path); //"~/Music"
		}
	}

	closedir(dir);
}

//ls 1.txt 
//ls dir
int main(int argc, const char *argv[])
{

	if (argc != 2)
	{
		printf("Usage: %s <filename>\n",argv[0]);
		return -1;
	}

//	do_ls_file(argv[1]);

	do_ls_dir(argv[1]);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值