acl/lib_acl_cpp/samples/scan_dir/main.cpp
2014-11-19 00:25:21 +08:00

140 lines
2.9 KiB
C++

#include <map>
#include "lib_acl.h"
#include "acl_cpp/lib_acl.hpp"
static void ls_file(acl::scan_dir& scan, const char* path, bool recursive,
bool fullpath)
{
if (scan.open(path, recursive) == false)
{
logger_error("open path: %s error: %s",
path, acl::last_serror());
return;
}
int nfiles = 0;
const char* filename;
while ((filename = scan.next_file(fullpath)) != NULL)
{
logger("filename: %s, path: %s", filename, scan.curr_path());
nfiles++;
}
logger("===========================================================");
logger("total file count: %d", nfiles);
}
static void ls_dir(acl::scan_dir& scan, const char* path, bool recursive,
bool fullpath)
{
if (scan.open(path, recursive) == false)
{
logger_error("open path: %s error: %s",
path, acl::last_serror());
return;
}
int ndirs = 0;
const char* dirname;
while ((dirname = scan.next_dir(fullpath)) != NULL)
{
logger("dirname: %s, path: %s", dirname, scan.curr_path());
ndirs++;
}
logger("===========================================================");
logger("total dir count: %d", ndirs);
}
static void ls_all(acl::scan_dir& scan, const char* path, bool recursive,
bool fullpath)
{
if (scan.open(path, recursive) == false)
{
logger_error("open path: %s error: %s",
path, acl::last_serror());
return;
}
int ndirs = 0, nfiles = 0;
const char* name;
bool is_file;
while ((name = scan.next(fullpath, &is_file)) != NULL)
{
logger("%s: %s, path: %s", is_file ? "filename" : "dirname",
name, scan.curr_path());
if (is_file)
nfiles++;
else
ndirs++;
}
logger("===========================================================");
logger("total dir count: %d, file count: %d", ndirs, nfiles);
}
static void usage(const char* procname)
{
logger("usage: %s -h [help] -d path -t type[dir|file|all] "
"-r [if recursive, default: false] "
"-a [if get fullpath, default: false]", procname);
}
int main(int argc, char* argv[])
{
int ch;
bool recursive = false, fullpath = false;
acl::string path, mode;
acl::log::stdout_open(true);
while ((ch = getopt(argc, argv, "hd:t:ra")) > 0)
{
switch (ch)
{
case 'h':
usage(argv[0]);
return 0;
case 'd':
path = optarg;
break;
case 't':
mode = optarg;
break;
case 'r':
recursive = true;
break;
case 'a':
fullpath = true;
break;
default:
break;
}
}
if (path.empty())
{
usage(argv[0]);
return 1;
}
acl::scan_dir scan;
if (mode == "dir")
ls_dir(scan, path, recursive, fullpath);
else if (mode == "file")
ls_file(scan, path, recursive, fullpath);
else
ls_all(scan, path, recursive, fullpath);
#ifdef WIN32
logger("===========================================================");
logger("enter any key to exit");
getchar();
#endif
return (0);
}