|
|
1.1 root 1: /****************************************************************************
2: *
3: * PROGRAM: WALK.C
4: *
5: * PURPOSE: Uses recursion to walk through all subdirectories in the
6: * current working directory
7: *
8: * FUNCTIONS:
9: *
10: * FindFirstDirectory() - finds the first directory in the current
11: * working directory
12: * Walk() - finds the subdirectories in the current working directory,
13: * changes the current working directory to this subdirectory,
14: * recusively calls itself until there are no more
15: * subdirectories
16: *
17: * COMMENTS:
18: *
19: ****************************************************************************/
20:
21: #include <windows.h>
22: #include <stdio.h>
23: #include <string.h>
24: #include <process.h>
25: #include "walk.h"
26:
27: /****************************************************************************
28: *
29: * FUNCTION: FindFirstDirectory(LPTSTR, LPWIN32_FIND_DATA)
30: *
31: * PURPOSE: finds the first directory in the current working directory
32: *
33: * COMMENTS:
34: *
35: * This function is called by Walk() each time a new subdirectory is
36: * entered. Since only directory entries are of interest, this call
37: * provides a simple means to bypass non-directory filenames.
38: *
39: * INPUT: lpszSearchFile -> "*"
40: * lpffd - pointer to the file find data structure of type
41: * WIN32_FIND_DATA
42: *
43: * OUTPUT: Returns a file handle if a directory is found
44: * Returns a -1 if no directory is found
45: *
46: ****************************************************************************/
47:
48: HANDLE FindFirstDirectory(LPTSTR lpszSearchFile, LPWIN32_FIND_DATA lpffd)
49: {
50: BOOL bRC;
51: DWORD dwRC;
52: HANDLE hSearch;
53: int iRC;
54:
55: hSearch=FindFirstFile(lpszSearchFile,lpffd);
56: if (hSearch == (HANDLE) -1)
57: return (hSearch);
58: for(;;)
59: {
60: dwRC=GetFileAttributes(lpffd->cFileName);
61: if (dwRC & FILE_ATTRIBUTE_DIRECTORY)
62: {
63: iRC=strcmp(lpffd->cFileName,".");
64: if (iRC)
65: {
66: iRC=strcmp(lpffd->cFileName,"..");
67: if (iRC)
68: return (hSearch);
69: }
70: }
71: bRC=FindNextFile(hSearch,lpffd);
72: if (bRC == FALSE)
73: {
74: FindClose(hSearch);
75: return ((HANDLE) -1);
76: }
77: }
78: }
79:
80: /****************************************************************************
81: *
82: * FUNCTION: FindNextDirectory(LPTSTR, LPWIN32_FIND_DATA)
83: *
84: * PURPOSE: finds the next directory in the current working directory
85: *
86: * COMMENTS:
87: *
88: * This function is called by Walk() each time a new subdirectory is
89: * entered. Since only directory entries are of interest, this call
90: * provides a simple means to bypass non-directory filenames.
91: *
92: * INPUT: lpszSearchFile -> "*"
93: * lpffd - pointer to the file find data structure of type
94: * WIN32_FIND_DATA
95: *
96: * OUTPUT: Returns a file handle if a directory is found
97: * Returns a -1 if no directory is found
98: *
99: ****************************************************************************/
100:
101: BOOL FindNextDirectory(HANDLE hSearch, LPWIN32_FIND_DATA lpffd)
102: {
103: BOOL bRC;
104: DWORD dwRC;
105:
106: for(;;)
107: {
108: bRC=FindNextFile(hSearch,lpffd);
109: if (bRC == FALSE)
110: return (FALSE);
111: dwRC=GetFileAttributes(lpffd->cFileName);
112: if (dwRC & FILE_ATTRIBUTE_DIRECTORY)
113: return (TRUE);
114: }
115: }
116:
117: /****************************************************************************
118: *
119: * FUNCTION: Walk(WORD)
120: *
121: * PURPOSE: finds a subdirectory in the current working directory,
122: * changes the current working directory to this subdirectory,
123: * and recusively calls itself until there are no more
124: * subdirectories
125: *
126: * COMMENTS:When a new directory is entered from above, a handle for
127: * the new directory is obtained using FindFirstDirectory. Once
128: * the first directory is found, the current working directory
129: * is changed to this first directory and Walk() is recursively
130: * called again. At this point, the next available directory
131: * is searched for using FindNextFile, entered and a recursive
132: * call is made to Walk(). When each directory has been searched,
133: * until no more directories exist, the current working directory
134: * is changed to the parent directory (..). This continues until
135: * the current working directory is equal to the original
136: * directory.
137: *
138: * INPUT: wLevel - bookmark, when wLevel is greater than 0, then the
139: * current working directory is a subdirectory of the original
140: * directory. If wLevel is equal to 0, then the directory is the
141: * original directory and the recursive calls stop
142: *
143: * OUTPUT:
144: *
145: ****************************************************************************/
146:
147: VOID Walk(WORD wLevel)
148: {
149: BOOL bRC=TRUE;
150: DWORD dwRC;
151: HANDLE hSearch;
152: WIN32_FIND_DATA w32FindBuf;
153:
154: dwRC=GetCurrentDirectory(BUFSIZE,chPathName);
155: if (dwRC >= (BUFSIZE-1))
156: {
157: printf("Buffer too small for path name. Exiting...\n");
158: exit(1);
159: }
160: printf("%s\n",chPathName);
161: hSearch=FindFirstDirectory("*",&w32FindBuf);
162: if (hSearch == (HANDLE) -1)
163: {
164: if (wLevel)
165: SetCurrentDirectory("..");
166: return;
167: }
168:
169: for (;;)
170: {
171: SetCurrentDirectory(w32FindBuf.cFileName);
172: Walk(++wLevel);
173: bRC=FindNextDirectory(hSearch,&w32FindBuf);
174: if (bRC == FALSE)
175: {
176: SetCurrentDirectory("..");
177: FindClose(hSearch);
178: return;
179: }
180: }
181: }
182:
183: VOID main(VOID)
184: {
185: Walk(0);
186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.