Code:
void doit(char *root, FILE *fileptr, char *sub)
{
flist list = { 0, 0, NULL };
HANDLE h;
WIN32_FIND_DATA info;
int i;
// build a list of files
h = FindFirstFile("*.*", &info);
if (h != INVALID_HANDLE_VALUE)
{
do
{
if (!(strcmp(info.cFileName, ".") == 0 || strcmp(info.cFileName, "..") == 0))
{
addfile(&list, info);
}
} while (FindNextFile(h, &info));
if (GetLastError() != ERROR_NO_MORE_FILES) errormessage();
FindClose(h);
}
else
{
errormessage();
}
// sort them
qsort(list.files, list.num_entries, sizeof(list.files[0]), sortfiles);
// print out in sorted order
int numdirs = 0;
for (i = 0; i < list.num_entries; i++)
{
char t1[50], t2[50], t3[50], a[10];
format_time(&list.files[i].ftCreationTime, t1);
format_time(&list.files[i].ftLastAccessTime, t2);
format_time(&list.files[i].ftLastWriteTime, t3);
format_attr(list.files[i].dwFileAttributes, a);
if (list.files[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// 'null' date for directory access times, which change each time
// we run this tool
sprintf(t2, "%4d/%02d/%02d %02d:%02d:%02d", 2000, 1, 1, 0, 0, 0);
}
fprintf(fileptr, "%s", sub);
fprintf(fileptr, "%s\n", list.files[i].cFileName);
printf("%s %10ld %s %s %s %s\\%s\n", a, list.files[i].nFileSizeLow, t1, t2, t3, root, list.files[i].cFileName);
if (list.files[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) numdirs++;
}
// now process all the sub-dirs
// free all the files first, to save a bit of space
// the sort function will have put them all at the end.
list.files = (WIN32_FIND_DATA *) realloc(list.files, numdirs * sizeof(WIN32_FIND_DATA));
for (i = 0; i < numdirs; i++)
{
char newroot[MAX_PATH];
char sub[100] = ".\\";
sprintf(newroot, "%s\\%s", root, list.files[i].cFileName);
SetCurrentDirectory(list.files[i].cFileName);
strcat(sub, list.files[i].cFileName);
strcat(sub, "\\");
doit(newroot, fileptr, sub);
SetCurrentDirectory("..");
}
// free the remainder
free(list.files);
fclose(fileptr);
}
program output: