C# · 12月 20, 2021

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

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 %sn”,dirpath);

return -1;

}

while((dirfile = readdir(d))!= NULL){

// 过滤.xx目录项

if(strncmp(dirfile->d_name,”.”,1) == 0)

continue;

stat(dirfile->d_name,&dirfileinfo);

cout<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 %sn”,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<<" "<pw_name<<" "<gr_name<<" "<<dirfileinfo.st_size<<" ";

printf(” %.12s”,4 + ctime(&dirfileinfo.st_mtime));

cout<<" "<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环境下编译执行后结果: