linux环境c/c++实现ls,ls -l

My_ls.cpp

//============================================================================
// Name        : Hellocpp.cpp
// Author      : lingo
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <ctime>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
using namespace std;
char filename[100][255]; 		//存储文件名字符串
int filenum = 0;
// 将文件权限描述id转换为读写权限字符
void stmode_to_rwx(int mode, char str[]){
    strcpy(str, "----------");
    if (S_ISDIR(mode)) str[0] = 'd';
    if (S_ISCHR(mode)) str[0] = 'c';
    if (S_ISBLK(mode)) str[0] = 'b';
    if ((mode & S_IRUSR)) str[1] = 'r';
    if ((mode & S_IWUSR)) str[2] = 'w';
    if ((mode & S_IXUSR)) str[3] = 'x';
    if ((mode & S_IRGRP)) str[4] = 'r';
    if ((mode & S_IWGRP)) str[5] = 'w';
    if ((mode & S_IXGRP)) str[6] = 'x';
    if ((mode & S_IROTH)) str[7] = 'r';
    if ((mode & S_IWOTH)) str[8] = 'w';
    if ((mode & S_IXOTH)) str[9] = 'x';
}
int ls_dir(char *dirpath){
	DIR *d;                     //DIR *opendir(const char *pathname),目录的返回结构体指针
	struct dirent *dirfile;		//用该结构体保存目录项
	struct stat dirfileinfo;	//目录项描述结构体
	if(!(d = opendir(dirpath))){
		printf("error opendir %s\n",dirpath);
		return -1;
	}
	while((dirfile = readdir(d))!= NULL){
		// 过滤.xx目录项
		if(strncmp(dirfile->d_name, ".", 1) == 0)
			continue;
		stat(dirfile->d_name,&dirfileinfo);
		cout<<dirfile->d_name<<" ";
	}
	cout<<endl;
	closedir(d);
	return 1;
}
int ls_l_dir(char *dirpath){
	DIR *d;                     //DIR *opendir(const char *pathname),目录的返回结构体指针
	struct dirent *dirfile;		//用该结构体保存目录项
	struct stat dirfileinfo;	//目录项描述结构体
	if(!(d = opendir(dirpath))){
		printf("error opendir %s\n",dirpath);
		return -1;
	}
	struct passwd *userinfo;
	struct group *groupinfo;
	while((dirfile = readdir(d))!= NULL){
		// 过滤.xx目录项
		if(strncmp(dirfile->d_name, ".", 1) == 0)
			continue;
		strcpy(filename[filenum++],dirfile->d_name); //存储目录项名称
		stat(dirfile->d_name,&dirfileinfo); //得到指定文件名的描述信息
		userinfo = getpwuid(dirfileinfo.st_uid);
		groupinfo = getgrgid(dirfileinfo.st_gid);
		char dirauth[11];
		stmode_to_rwx(dirfileinfo.st_mode,dirauth);
		cout<<dirauth<<" " <<dirfileinfo.st_nlink<<" "<< userinfo->pw_name<<" "<<groupinfo->gr_name<<" "<<dirfileinfo.st_size<<" ";
		printf(" %.12s", 4 + ctime(&dirfileinfo.st_mtime));
		cout<<" "<<dirfile->d_name;
		cout<<endl;
	}
	closedir(d);
	return 1;
}
int main(int args,char* argv[]) {
	char pwddir[255];  	//存储当前工作环境下绝对路径
	getcwd(pwddir,255);	//得到当前工作环境绝对路径
	if( args > 1){
//printf("your command : ./ %s,%s",argv[0],argv[1]);
		int i =2;
		if(memcmp(argv[1],"-l",i)==0){
			ls_l_dir(pwddir);     //遍历当前工作环境路径下
		}else{
			printf("Usage:%s -l \n",argv[0]);
		}
	}else{
		ls_dir(pwddir);
	}
	return 0;
}

ubuntu环境下编译执行后结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值