#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
/*
ls_l:列举目录下所有文件信息(包含子目录)
@const char *pathname:目录
返回值:成功返回0,失败返回-1
*/
int ls_dir(const char *pathname);
/*
ls_l:列举文件信息
@const char *pathname:要列举的目录
返回值:成功返回0,失败返回-1;
*/
int ls_l(const char *pathname );
struct stat *Stat;
struct dirent *dir = NULL;
int ls_l(const char *pathname )
{
printf("\n ");
//第一步:获取信息:
stat(pathname,Stat);
//判断文件类型
switch (Stat->st_mode & S_IFMT) {
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFDIR: printf("d"); break;
case S_IFIFO: printf("p"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFSOCK: printf("s"); break;
default: printf("unknown?\n"); break;
}
//判断文件的 usr 、group、 other 权限
Stat->st_mode & S_IRUSR ? printf("r") : printf("-");
Stat->st_mode & S_IWUSR ? printf("w") : printf("-");
Stat->st_mode & S_IXUSR ? printf("x") : printf("-");
Stat->st_mode & S_IRGRP ? printf("r") : printf("-");
Stat->st_mode & S_IWGRP ? printf("w") : printf("-");
Stat->st_mode & S_IXGRP ? printf("x") : printf("-");
Stat->st_mode & S_IROTH ? printf("r") : printf("-");
Stat->st_mode & S_IWOTH ? printf("w") : printf("-");
Stat->st_mode & S_IXOTH ? printf("x") : printf("-");
//输出文件的硬链接数和usr 、group的ID
printf(" %ld %d %d",Stat->st_nlink, Stat->st_uid,Stat->st_gid);
//输出文件大小
printf(" %ld " ,Stat->st_size);
//输出文件的最后访问时间
char sp[64] = {0};
strcpy(sp,ctime((const time_t*)(&Stat->st_atim)));
int j = 0;
while(1)
{
if(sp[j] == '\n')
break;
printf("%c",sp[j]);
j++;
}
//输出文件名
printf(" ");
int a = strlen(pathname);
while(1)
{
if(pathname[a] == '/')
break;
a--;
}
char nu[256] = {0};
int i = 0;
while(1)
{
a++;
if(pathname[a] == 0)
break;
nu[i] = pathname[a];
i++;
}
printf("%s",nu);
return 0;
}
int ls_dir(char *pathname)
{
//第一步:打开这个文件
DIR *d = opendir(pathname);
if(d == NULL)
{
perror("opendir error");
return -1;
}
//第二步:读取目录
struct dirent *read_d = NULL;
while(1)
{
read_d = readdir(d);
if(read_d == NULL && errno == 0)
{
break;
}
else if(read_d == NULL && errno != 0)
{
perror("readdir error");
return -1;
}
//否则表示读到了 接下来就要解析 如何解析: 判断文件的类型
if(read_d->d_type == DT_DIR)
{
if(strcmp(read_d->d_name,".") == 0 || strcmp(read_d->d_name,"..") == 0)
continue;
else
{
char str[512] = {0};
sprintf(str,"%s/%s",pathname,read_d->d_name);
printf("%s",str);
ls_dir(str);
printf("\n");
}
}
//如果不是目录文件则输出
else
{
char str[512] = {0};
sprintf(str,"%s/%s",pathname,read_d->d_name);
ls_l(str);
}
}
//关闭
int ret = closedir(d);
if(ret < 0)
{
perror("close dir error");
return -1;
}
return 0;
}
int main(int argc, char * * argv)
{
Stat = (struct stat *)malloc(sizeof(struct stat));
ls_dir(argv[1]);
return 0;
}
c语言实现linux下的 ls -l命令
最新推荐文章于 2023-09-07 23:06:22 发布
本文详细介绍了一个名为ls_l的程序,该程序能够列出Linux目录中所有文件的详细信息,包括文件类型、权限、硬链接数、用户和组ID、文件大小、最后访问时间和文件名。此外,程序还具备递归列出子目录的功能。
摘要由CSDN通过智能技术生成