#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
#include <string.h>
struct passwd* pw;
struct group* gr;
struct tm* tm;
void display(struct stat info,char* path){
int i;
switch(info.st_mode&S_IFMT){
case S_IFREG: printf("-"); break;
case S_IFDIR: printf("d"); break;
case S_IFLNK: printf("l"); break;
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFIFO: printf("p"); break;
case S_IFSOCK: printf("s"); break;
}
for(i=8;i>=0;i--){
if(info.st_mode&(1<<i)){
switch(i%3){
case 2: printf("r"); break;
case 1: printf("w"); break;
case 0: printf("x"); break;
}
}
else
printf("-");
}
pw = getpwuid(info.st_uid);
gr = getgrgid(info.st_gid);
printf(" %d %s %s %d ",info.st_nlink,pw->pw_name,gr->gr_name,info.st_size);
tm = localtime(&info.st_ctime);
printf("%02d月 %02d %02d:%02d %s\n",tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,path);
}
int main(){
struct stat info;
char* path = malloc(100);
printf("请输入要ls查看的内容:");
scanf("%s",path);
//printf("%s\n",path);
int i;
int res = stat(path,&info);
if(res == -1)
perror("stat"),exit(-1);
if(S_ISREG(info.st_mode))
display(info,path);
if(S_ISDIR(info.st_mode)){
DIR* dir = opendir(path);
if(dir==NULL) return ;
chdir(path);
struct dirent* ent = NULL;
while(ent = readdir(dir)){
if((strcmp(ent->d_name,".")==0)||(strcmp(ent->d_name,"..")==0))
continue;
else{
stat(ent->d_name,&info);
//chdir(ent->d_name);
display(info,ent->d_name);
}
}
chdir("..");
}
return 0;
}
linux编程:ls命令的简单实现
最新推荐文章于 2024-01-21 07:00:00 发布