ls基本功能的实现
来源:互联网 发布:mac skype 下载 编辑:程序博客网 时间:2024/05/22 00:47
要说我们的命令,那不可少的就是ls,那么ls就是列出当前目录下的文件。
这里有命令解释器的实现:http://blog.csdn.net/qq_35256722/article/details/53316066
包含pwd和clear命令:http://blog.csdn.net/qq_35256722/article/details/53322604
函数介绍:
1.struct dirent *entry;
2.struct stat statbuf[100];
3.DIR *open(const char *name); 打开目录
在我的代码中出现的:dp = opendir(dir)) 打开dir这个目录 ,
4. struct dirent *entry; entry 里面有两个信息d_ino 和d_name
在我的代码中出现的:entry = readdir(dp) 从该目录下,读出来详细的信息,存在entry这个结构体中,这个结构体含有文件名和结点信息。
5. 在我的代码中出现的:lstat(entry->d_name,&statbuf[i]); 根据这个文件名字找到关于该文件的众多信息,
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
6. S_ISDIR(m) 查看是否为目录文件
在我的代码中出现的:S_ISDIR(statbuf[j].st_mode) ,查看是否为目录文件
7. 用这些宏来&这些权限,&相同为1,不同为0,那么就是与组权限的可执行 &,只有相同那么才说明拥有该权限。u、o一样。
在我的代码中出现的:if(statbuf[j].st_mode & S_IXUSR || statbuf[j].st_mode & S_IXGRP|| statbuf[j].st_mode & S_IXOTH ) 是否是可执行文件
8. printf("\033[1;34m%s \033[0m",name[j]); 打印颜色;
更多颜色信息在:http://blog.csdn.net/qq_35256722/article/details/53323068
9.mode &S_IRUSR 是否有权限, 解释同7.
代码如下:
#include<stdio.h>#include<unistd.h>#include<dirent.h>#include<string.h>#include<stdlib.h>#include<sys/stat.h>#include<grp.h>#include<pwd.h>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';}void swap(struct stat *rs,char *sr1,char *sr2,int m){char tmp[100] = {0};strcpy(tmp,sr1);strcpy(sr1 , sr2);strcpy(sr2 , tmp);struct stat tmp1;tmp1 = rs[m];rs[m] = rs[m+1];rs[m+1] = tmp1;}void print_d(struct stat statbuf[],char name[100][100],int j){ if(S_ISDIR(statbuf[j].st_mode)) { printf("\033[1;34m%s \033[0m",name[j]); } else{if(statbuf[j].st_mode & S_IXUSR || statbuf[j].st_mode & S_IXGRP|| statbuf[j].st_mode & S_IXOTH ){ printf("\033[1;32m%s \033[0m",name[j]);}else{ printf("%s ",name[j]);}}}void sort(struct stat st[],char name[100][100],int num){int i = 0;int j = 0; for(j = 0; j < num-1; j ++){for(i = 0; i < num-1-j;i ++){ if(strcmp(name[i] ,name[i+1]) > 0) { swap(st,name[i],name[i+1],i); }}}}void printdir(char *dir,char *argv){DIR *dp;struct dirent *entry;struct stat statbuf[100];char name[100][100]= {0};int i = 0;int count = 0;char modestr[11];if((dp = opendir(dir)) == NULL){printf("cannot open!!!\n");return ;}while((entry = readdir(dp)) !=NULL){lstat(entry->d_name,&statbuf[i]);strcpy(name[i],entry->d_name);i ++;count ++;}sort(statbuf,name,count);int k = 0;for(k = 0;k < i; k ++){if(argv == NULL){ if(strncmp(".",name[k],1) == 0) continue; print_d(statbuf,name,k);}else if(strcmp(argv,"-a") == 0){ //if(strncmp(".",name[k],1) == 0) // continue; print_d(statbuf,name,k);}else if(strcmp(argv,"-l") == 0){ if(strncmp(".",name[k],1) == 0) continue; mode_to_letters(statbuf[k].st_mode,modestr);printf("%s",modestr);printf("%4d",(int)statbuf[k].st_nlink);printf("%-8s",getpwuid(statbuf[k].st_uid)->pw_name);printf("%-8s",getgrgid(statbuf[k].st_gid)->gr_name);printf("%8ld",(long)statbuf[k].st_size);printf("%.12s",4+ctime(&statbuf[k].st_mtime)); print_d(statbuf,name,k);printf("\n");}else if(strcmp(argv,"-i") == 0){ if(strncmp(".",name[k],1) == 0) continue;printf("%d ",statbuf[k].st_ino); print_d(statbuf,name,k);}else{printf("error bg !\n");}}closedir(dp);}int main(int argc,char *argv[]){char *topdir = ".";printdir(topdir,argv[1]);printf("\n");return 0;}
- ls基本功能的实现
- WINCE实现的基本功能
- wince实现的基本功能
- 串的基本功能实现
- Animation基本功能的实现
- C实现数组的基本功能
- C#实现俄罗斯方块的基本功能
- 顺序栈基本功能的实现
- python实现ftp的基本功能
- 二叉树的基本功能实现
- 链表的基本功能实现
- 复数类的基本功能实现
- VC实现俄罗斯方块的基本功能
- C++实现双链表的基本功能
- Jquery实现多选框的基本功能
- 矩阵的基本功能 SCALA实现
- PC实现路由器的基本功能
- python实现ftp的基本功能
- jenkins-1.59+sonarqube-6.1+sonar-scanner-2.8+hg-3.9.2+maven-3.3.9+shell检查打包编译java项目
- JWT实现token-based会话管理
- mongodb副本集,分片搭建,与spring整合
- 【HDOJ】5992 Finding Hotels
- jQuery中$()可以有两个参数
- ls基本功能的实现
- 新上市Lighthouse专用芯片TS3633规格介绍
- SQL中的cast()函数详解
- Box2D 源码编译
- java基础——java.util.ConcurrentModificationException
- 好姑娘向暖而生
- poj1523 最小割+并查集
- 日常生活中有哪些十分钟就能学会并可以终生受用的技能
- AngularJS事件绑定的使用详解