实现输出当前目录下的文件名

ls功能:

方法一:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>
#include <string>
using namespace std; bool cmp( string s1,string s2){
return s1<s2;
} int main()
{
DIR *dir;
char s[];
string data[];
int tot=;
struct dirent *rent;
dir =opendir(".");
while(rent=readdir(dir))
{
strcpy(s,rent->d_name);
if(s[]!='.'){
data[tot]=s;
tot++;
}
}
sort(data,data+tot,cmp);
for(int i=;i<tot;i++)
cout<<data[i]<<" ";
puts("");
closedir(dir);
return ;
}

方法二:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
int do_ls(char *dir,char *filename,int lflag)
{
int n;
struct stat buf;
char out[];
struct passwd *pw;
struct group *gr;
struct tm *t;
if(lflag == ) //如果不带l参数,直接显示文件/目录名
{
printf("%s\t",filename);
return ;
}
if(lstat(dir,&buf)<)
{
fprintf(stderr,"stat error:%s\n",strerror(errno));
return -;
}
switch(buf.st_mode & S_IFMT) //获取字符串的属性:普通文件-、目录d、字符设备c、块设备b、管道文件p、连接文件l、套接字文件s
{
case S_IFREG:
printf("-");
break;
case S_IFDIR:
printf("d");
break;
case S_IFCHR:
printf("c");
break;
case S_IFBLK:
printf("b");
break;
case S_IFIFO:
printf("p");
break;
case S_IFLNK:
printf("l");
break;
case S_IFSOCK:
printf("s");
break;
}
for(n=; n>=; n--) //打印文件的读写属性:读r、写w、执行x、无权限-
{
if(buf.st_mode&(<<n))
{
switch(n%)
{
case :
printf("r");
break;
case :
printf("w");
break;
case :
printf("x");
break;
default:
break;
}
}
else
{
printf("-");
}
}
printf(" %d",buf.st_nlink); //硬链接数,此链接非彼链接,指(包含)目录的个数,文件为1,目录起始为2,再加上目录里包含的目录个数(不递归,只一层)
pw = getpwuid(buf.st_uid); //所属用户名
printf(" %s",pw->pw_name);
gr = getgrgid(buf.st_gid); //所属组名
printf(" %s",gr->gr_name);
printf(" %ld",buf.st_size); //字节计总大小
t = localtime(&buf.st_atime); //最后一次访问时间
printf(" %d-%d-%d %d:%d"
,t->tm_year+
,t->tm_mon+
,t->tm_mday
,t->tm_hour
,t->tm_min);
printf(" %s ",filename);
if(S_ISLNK(buf.st_mode)) //判断是否为链接,是返回真
{
printf(" -> ");
if(readlink(filename,out,)==-)
{
//printf("readlink error\n");
}
printf("%s",out);
}
printf("\n");
return ;
}
int ls_prepare(char *w,int aflag,int lflag) //ls的准备工作
{
struct stat buf; //man lstat可以看到此结构
char name[];
DIR *dir; //类似打开文件的fd描述符
struct dirent *pdr; //man readdir可以看到此结构
if(lstat(w,&buf)<) //获取文件/目录属性并赋值给buf,该函数和lstat一样,只是当w为链接时,指代他本身,并不存在文件
{
fprintf(stderr,"stat error:%s\n",strerror(errno));
return -;
}
if(S_ISDIR(buf.st_mode)) //判断是否为目录,是返回真
{
dir = opendir(w); //打开目录
while ((pdr = readdir(dir))!=NULL) //读/遍历目录
{
if(aflag==) //如果不带a参数,越过以.开头的所有文件/目录
{
if(pdr->d_name[]=='.')
continue;
memset(name,,);
strcpy(name,w); //拷贝
strcat(name,"/"); //追加
strcat(name,pdr->d_name);
do_ls(name,pdr->d_name,lflag);
}
else //有a参数显示所有
{
memset(name,,);
strcpy(name,w);
strcat(name,"/");
strcat(name,pdr->d_name);
do_ls(name,pdr->d_name,lflag);
}
}
closedir(dir);
}
else //为文件则直接显示
{
do_ls(w,w,lflag);
}
return ;
}
int main(int argc,char **argv)
{
int aflag =;
int lflag =;
char c;
int i;
while((c = getopt(argc,argv,"al"))!=-) //解析命令行参数,即-/--后面的字符串和给定的字符串匹配,有未解析字母返回字母或问号(取决于第3个参数),否则返回-1
{
switch(c) //此处仅匹配a(所有)和l(列表),即只支持参数a、l
{
case 'a':
aflag =;
break;
case 'l':
lflag =;
break;
default:
break;
}
}
if(argc == optind )
{
ls_prepare("./",aflag,lflag);
}
else
{
for(i=optind; i<argc; i++) //所有目录都传进去
ls_prepare(argv[i],aflag,lflag);
}
printf("\n");
return ;
}

ls -l功能:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h> void show_file_info(char* filename, struct stat* info_p) {
char* uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters();
char modestr[11]; mode_to_letters(info_p->st_mode, modestr); printf("%s", modestr);
printf(" %4d", (int) info_p->st_nlink);
printf(" %-8s", uid_to_name(info_p->st_uid));
printf(" %-8s", gid_to_name(info_p->st_gid));
printf(" %8ld", (long) info_p->st_size);
printf(" %.12s", 4 + ctime(&info_p->st_mtime));
printf(" %s\n", filename); } void mode_to_letters(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';
}
} char* uid_to_name(uid_t uid){
struct passwd* getpwuid(),* pw_ptr;
static char numstr[10]; if((pw_ptr = getpwuid(uid)) == NULL){
sprintf(numstr,"%d",uid); return numstr;
}else{
return pw_ptr->pw_name;
}
} char* gid_to_name(gid_t gid){
struct group* getgrgid(),* grp_ptr;
static char numstr[10]; if(( grp_ptr = getgrgid(gid)) == NULL){
sprintf(numstr,"%d",gid);
return numstr;
}else{
return grp_ptr->gr_name;
}
}
void do_ls(char dirname[]) {
DIR* dir_ptr;
struct dirent* direntp; if ((dir_ptr = opendir(dirname)) == NULL) {
fprintf(stderr, "ls2: cannot open %s \n", dirname);
} else {
while ((direntp = readdir(dir_ptr)) != NULL) {
dostat(direntp->d_name);
} close(dir_ptr);
}
} void dostat(char* filename) {
struct stat info; if (stat(filename, &info) == -1) {
perror(filename);
} else {
show_file_info(filename, &info);
}
} int main(int ac,char* av[]){
if(ac == 1){
do_ls(".");
}else{
while(--ac){
printf("%s: \n",*++av);
do_ls(*av);
}
}
}

  

用C++实现Linux中shell的ls功能的更多相关文章

  1. Linux中Shell

    Linux中Shell Shell是什么 ​ Shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,可以用Shell来启动.挂起.停止.编写一些程序. S ...

  2. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  3. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释 linux中shell变量$#,$@,$0,$1,$2的含义解释:  变量说明:  $$  Shell本身的PID(ProcessID ...

  4. Linux中shell变量$0,$?等含义

    linux中shell变量$#,$@,$0,$1,$2的基本含义: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  5. 【转】linux中shell变量$#,$@,$0,$1,$2的含义解释

    原文网址:http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html linux中shell变量$#,$@,$0,$1,$2的含义解释: ...

  6. 【Shell】linux中shell变量$#,$@,$0,$1,$2的含义解释 && set 关键字使用

    linux中shell变量$#,$@,$0,$1,$2的含义解释   摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linu ...

  7. linux中shell变量$#,$@,$0,$1,$2的含义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  8. linux中shell变量$#,$@,$0,$1,$2

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  9. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

随机推荐

  1. 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

    大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...

  2. gitHub使用入门和github for windows的安装教程

    在看这篇教程之前我想大家也在搜索怎样使用gitHub托管自己的项目,在使用gitHub之前我也遇到过各种问题,在网上我也搜索了很多,但总觉得网上搜索到的东西很多很杂,有的根本不知道是在表达什么.在这过 ...

  3. 4.Android 打包时出现的Android Export aborted because fatal error were founds [closed]

    Android 程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成Android 安装包文件(Android Package,APK),其扩展名为.apk.使用run as 也能 ...

  4. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  5. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  6. 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

    我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...

  7. ASP.NET中画图形验证码

    context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...

  8. 浅谈Slick(2)- Slick101:第一个动手尝试的项目

    看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法.我把这个过程中的一些了解和想法记录下来和大家一起分享.首先我用IntelliJ- ...

  9. Js 数组返回去重后的数据

    function removeRepeat(data) { var temp = ""; var mainData = []; for (var i = 0; i < dat ...

  10. BPM合同管理解决方案分享

    一.方案概述合同是组织与组织间所订协议的法律 表现形式,体现着双方对于合作在法律和道德上的承诺.然而,大多数企业的合同管理都或多或少存在合同审批过程不规范.签订草率.审批权责不清.合同执行跟踪难.合同 ...