#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
#define err_quit printf
#define err_sys printf
#define TRUE 1
#define FALSE 0
#define EXIT_FAILE 0
#define EXIT_SUCESS 1
#define bool char
static char g_cur_dir[256] = "";
int read_directory(char *dir_name, bool brecurse);
void usage(char state, char *str);
int main(int argc, char **argv)
{
int c;
char recurse = 0;
struct option long_option[]= {
{"dirname", no_argument, NULL, 0 },
{"recurse", optional_argument, NULL, 'r'},
{"help", no_argument, NULL, 'h'},
{0, 0, 0, 0 },
};
//read current directory.
//if no any params, read current dir files.
if(argc < 2)
{
read_directory("./", TRUE);
return ;
}
//read command line params.
while((c = getopt_long(argc, argv, "hr::", long_option, NULL)) != EOF)
//while((c = getopt(argc, argv, ":hr::")) != EOF)
{
switch(c)
{
case 'r':
recurse = 1;
break;
case 'h':
usage(EXIT_SUCESS, argv[0]);
break;
default:
usage(EXIT_FAILE, argv[0]);
break;
}
}
if (recurse && (optind == argc))
{
read_directory("./", TRUE);
exit(0);
}
//read all files from argv[optind].
for(; optind < argc; ++optind)
{
read_directory(argv[optind], recurse);
}
exit(0);
}
int read_directory(char *dir_name, bool brecurse)
{
DIR *dp;
struct dirent *dir;
strcpy(g_cur_dir, dir_name);
if (g_cur_dir[strlen(g_cur_dir) -1] == '/')
g_cur_dir[strlen(g_cur_dir) -1] = 0;
if ((dp = opendir(dir_name)) == NULL)
{
err_sys("can't open %s. \n", dir_name);
return ;
}
while( (dir = readdir(dp)) != NULL)
{
if ( brecurse && (DT_DIR == dir->d_type)
&& (strcmp(dir->d_name, ".") != 0)
&& (strcmp(dir->d_name, "..") != 0) )
{
printf("%s/", g_cur_dir);
printf("%s\n", dir->d_name);
strcat(g_cur_dir, "/");
strcat(g_cur_dir, dir->d_name);
read_directory(g_cur_dir, brecurse);
g_cur_dir[strlen(g_cur_dir) - strlen(dir->d_name) - 1] = 0;
}
else
{
printf("%s/", g_cur_dir);
printf("%s\n", dir->d_name);
}
}
closedir(dp);
}
void usage(char state, char *str)
{
if (state == EXIT_FAILE)
{
printf("\n");
}
else
{
printf("\n");
printf("========================================\n");
printf("read directory:\n");
printf("\n");
printf("Usage: %s [-r] [directory]\n\n", str);
printf(" -r: read all files under each directory, recursively. \n");
printf("========================================\n");
printf("/n");
exit(0);
}
}