mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-03 20:38:11 +08:00
140 lines
2.9 KiB
C++
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);
|
|
}
|