#include <stdio.h>
#include <iostream>
#include <vector>
struct file_info_t
{
unsigned long long ud_tm;
unsigned int file_len;
std::string file_name;
};
unsigned long long get_curr_time()
{
time_t now;
time(&now);
return now;
}
void scan_disk_files(char* path, std::vector<struct file_info_t>& dst, std::vector<string>& vdirs, int& file_numbs)
{
DIR *d = NULL;
struct dirent *dp = NULL;
struct stat st,lst;
char p[1024] = {0};
int ret;
char *dumpstr = "/";
char *ch = "";
char tmp[1024];
int rlen;
if (path[0] == 0)
{
return ;
}
if (path[strlen(path) - 1] == '/')
{
//ch = "";
}else {
ch = dumpstr;
}
memset((void *)&st, 0, sizeof(st));
if(stat(path, &st) < 0 || !S_ISDIR(st.st_mode)) {
return;
}
if(!(d = opendir(path))) {
return;
}
usleep(1);
while((dp = readdir(d)) != NULL) {
if((!strncmp(dp->d_name, ".", 1)) || (!strncmp(dp->d_name, "..", 2)))
continue;
memset(p, 0, 1024);
snprintf(p, sizeof(p) - 1, "%s%s%s", path, ch, dp->d_name);
memset((void *)&st, 0, sizeof(st));
memset((void *)&lst, 0, sizeof(st));
ret = stat(p, &st);
lstat(p, &lst);
rlen = snprintf(tmp, 1024, "%s%s%s",path, ch, dp->d_name);
if(!S_ISLNK(lst.st_mode) && S_ISREG(st.st_mode))
{
struct file_info_t ft;
ft.ud_tm = st.st_mtime;
ft.file_len = st.st_size;
ft.file_name = tmp;
dst.push_back(ft);
file_numbs++;
memset(tmp, 0, rlen);
} else if(!S_ISLNK(lst.st_mode) && S_ISDIR(st.st_mode)){
//microsecond(2);
vdirs.push_back(tmp);
scan_disk_files(p, dst, vdirs, file_numbs);
}
}
closedir(d);
return;
}
int main(int argc, char *argv[])
{
std::vector<struct file_info_t> vfiles;
std::vector<std::string> vdirs;
int m_dwFileTotalNum = 0;
char *g_scan_path = "/";
printf("\n Start scan disk time:%llu \n", get_curr_time());
scan_disk_files(g_scan_path, vfiles, vdirs, m_dwFileTotalNum);
std::vector<struct file_info_t>::iterator it = vfiles.begin();
printf("\n file list\n\n");
for(; it != vfiles.end(); it++)
{
printf("create time:%lld, length:%d, name: %s\n", (*it).ud_tm, (*it).file_len, (*it).file_name.c_str());
}
printf("\n");
printf("\n End scan disk time:%llu \n scan files:%d \n", get_curr_time(), m_dwFileTotalNum);
return 0;
}