windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/tools/enumtree/enumtree.c
2020-09-26 16:20:57 +08:00

230 lines
4.8 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
enumtree.c
Abstract:
Performs a test of the file enumeration code.
Author:
Jim Schmidt (jimschm) 14-Jan-1998
Revision History:
<alias> <date> <comments>
--*/
#include "pch.h"
VOID
HelpAndExit (
VOID
)
{
printf ("Command line syntax:\n\n"
"enumtree [-d|-f] [-i] [-p:pattern] [-s] [-x:ext] [-x:ext] [-x:...] <root>\n\n"
"<root> Specifies the root path to enumerate (required)\n"
"-d Specifies dirs should be recursed before files are listed\n"
"-f Specifies files should be listed before dirs are recursed\n"
"-i Specifies that the scan will be in depth first\n"
"-p Specifies a pattern of files to find\n"
"-s SLM mode (outputs files not read-only)\n"
"-e Specifies file to exclused from the -s option\n"
"-x Specifies extension to exclude from the -s option\n"
);
exit(0);
}
BOOL
pScanGrowListForStr (
IN PGROWLIST Exclusions,
IN PCTSTR SearchStr
)
{
UINT i;
UINT Size;
PCTSTR Str;
Size = GrowListGetSize (Exclusions);
for (i = 0 ; i < Size ; i++) {
Str = GrowListGetString (Exclusions, i);
if (StringIMatch (SearchStr, Str)) {
return TRUE;
}
}
return FALSE;
}
HANDLE g_hHeap;
HINSTANCE g_hInst;
INT
__cdecl
_tmain (
INT argc,
TCHAR *argv[]
)
{
TREE_ENUM e;
PCTSTR RootPath;
PCTSTR FilePattern;
INT i;
UINT u;
BOOL DirsFirst = TRUE;
BOOL DepthFirst = FALSE;
UINT Files, Dirs;
BOOL SlmMode = FALSE;
PCTSTR Ext = NULL;
GROWLIST FileExclusions = GROWLIST_INIT;
GROWLIST ExtExclusions = GROWLIST_INIT;
RootPath = NULL;
FilePattern = NULL;
g_hHeap = GetProcessHeap();
for (i = 1 ; i < argc ; i++) {
if (argv[i][0] == TEXT('-') || argv[i][0] == TEXT('/')) {
switch (_totlower (argv[i][1])) {
case TEXT('d'):
DirsFirst = TRUE;
break;
case TEXT('f'):
DirsFirst = FALSE;
break;
case TEXT('i'):
DepthFirst = TRUE;
break;
case TEXT('p'):
if (argv[i][2] == ':') {
FilePattern = &argv[i][3];
} else if (i + 1 < argc) {
FilePattern = argv[i + 1];
} else {
HelpAndExit();
}
break;
case TEXT('x'):
if (argv[i][2] == ':') {
Ext = &argv[i][3];
} else if (i + 1 < argc) {
Ext = argv[i + 1];
} else {
HelpAndExit();
}
GrowListAppendString (&ExtExclusions, Ext);
break;
case TEXT('e'):
if (argv[i][2] == ':') {
Ext = &argv[i][3];
} else if (i + 1 < argc) {
Ext = argv[i + 1];
} else {
HelpAndExit();
}
GrowListAppendString (&FileExclusions, Ext);
break;
case TEXT('s'):
SlmMode = TRUE;
break;
default:
HelpAndExit();
}
}
else if (RootPath) {
HelpAndExit();
}
else {
RootPath = argv[i];
}
}
if (!RootPath) {
HelpAndExit();
}
Files = 0;
Dirs = 0;
if (EnumFirstFileInTreeEx (&e, RootPath, FilePattern, DirsFirst, DepthFirst, FILE_ENUM_ALL_LEVELS)) {
do {
if (e.Directory) {
Dirs++;
} else {
Files++;
}
if (!SlmMode) {
for (u = 0 ; u < e.Level ; u++) {
_tprintf (TEXT(" "));
}
_tprintf (TEXT("%s\n"), e.Name);
} else {
if (!e.Directory && !(e.FindData->dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
Ext = GetFileExtensionFromPath (e.Name);
if (!Ext) {
Ext = S_EMPTY;
}
if (!pScanGrowListForStr (&ExtExclusions, Ext) &&
!pScanGrowListForStr (&FileExclusions, e.Name)
) {
_tprintf (TEXT("%s\n"), e.SubPath);
}
}
}
} while (EnumNextFileInTree (&e));
}
if (!SlmMode) {
_tprintf (TEXT("\nFiles: %u\nDirs: %u\n"), Files, Dirs);
}
FreeGrowList (&ExtExclusions);
return 0;
}