为了实现Linux下ls的功能
逐步完成各项功能
递归显示文件夹与子文件下文件名称
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
int readFileList(char *basePath)
{
DIR *dir;
struct dirent *ptr;
char base[1000];
if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit(1);
}
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
else if(ptr->d_type == 8) ///file
printf("d_name:%s/%s\n",basePath,ptr->d_name);
else if(ptr->d_type == 10) ///link file
printf("d_name:%s/%s\n",basePath,ptr->d_name);
else if(ptr->d_type == 4) ///dir
{
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
readFileList(base);
}
}
closedir(dir);
return 1;
}
int main(void)
{
DIR *dir;
char basePath[1000];
///get the current absoulte path
memset(basePath,'\0',sizeof(basePath));
getcwd(basePath, 999);
printf("the current dir is : %s\n",basePath);
///get the file list
// memset(basePath,'\0',sizeof(basePath));
// strcpy(basePath,"./XL");
readFileList(basePath);
return 0;
}
显示文件大小和最后修改时间
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <string.h>
static int get_file_size_time (const char *filename)
{
struct stat statbuf;
if (stat (filename, &statbuf) == -1)
{
printf ("Get stat on %s Error:%s\n", filename, strerror (errno));
return (-1);
}
if (S_ISDIR (statbuf.st_mode))
return (1);
if (S_ISREG (statbuf.st_mode))
printf ("%s size:%ld bytes\tmodified at %s",
filename, statbuf.st_size, ctime (&statbuf.st_mtime));
return (0);
}
int main (int argc, char **argv)
{
DIR *dirp;
struct dirent *direntp;
int stats;
if (argc != 2)
{
printf ("Usage:%s filename\n\a", argv[0]);
exit (1);
}
if (((stats = get_file_size_time (argv[1])) == 0) || (stats == -1))
exit (1);
if ((dirp = opendir (argv[1])) == NULL)
{
printf ("Open Directory %s Error:%s\n", argv[1], strerror (errno));
exit (1);
}
while ((direntp = readdir (dirp)) != NULL)
if (get_file_size_time (direntp ->d_name) == -1)
break;
closedir (dirp);
exit (1);
}