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