C 打印给定路径中的所有文件和子目录
因此,我正在编写一个程序,以递归方式打印给定路径中的目录/子目录和文件。我可以进入第一个子目录并打印其中的所有文件。我现在的问题是,我需要找到一种方法,退一步,从我停止阅读的地方继续。直到条件在原始目录级别发生C 打印给定路径中的所有文件和子目录,c,windows,recursion,C,Windows,Recursion,因此,我正在编写一个程序,以递归方式打印给定路径中的目录/子目录和文件。我可以进入第一个子目录并打印其中的所有文件。我现在的问题是,我需要找到一种方法,退一步,从我停止阅读的地方继续。直到条件在原始目录级别发生 #include "Everything.h" #include "Strsafe.h" WIN32_FIND_DATA ffd; HANDLE hFind = INVALID_HANDLE_VALUE; LARGE_INTEGER fileSize; DWORD
#include "Everything.h"
#include "Strsafe.h"
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
LARGE_INTEGER fileSize;
DWORD dwError;
void showdir(TCHAR *szDir);
int _tmain(int argc, LPCTSTR argv[])
{
TCHAR szDir[MAX_PATH];
size_t lengthOfArg;
// verify number of parameters
if (argc != 2)
{
ReportError(_T("Error: Incorrect number of arguments"), 1, FALSE);
}
// get the length of the entered directory
StringCchLength(argv[1], MAX_PATH, &lengthOfArg);
// verify that the directory path is not too long
if (lengthOfArg > MAX_PATH - 2)
{
ReportError(_T("Error: Directory too long"), 2, FALSE);
}
// attach an asterisk (wildcard search char) to end of directory path
StringCchCopy(szDir, MAX_PATH, argv[1]);
StringCchCat(szDir, MAX_PATH, _T("*"));
showdir(szDir);
}
void showdir(TCHAR *szDir)
{
// begin the search; find the first file in the directory
hFind = FindFirstFile(szDir, &ffd);
if (hFind == INVALID_HANDLE_VALUE)
{
ReportError(_T("Error in searching"), 3, TRUE);
}
//hFind = FindFirstFile(szDir, &ffd);
while (FindNextFile(hFind, &ffd) != 0)
{
if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
{
fileSize.LowPart = ffd.nFileSizeLow;
fileSize.HighPart = ffd.nFileSizeHigh;
_tprintf(_T("%s %ld\n"), ffd.cFileName, fileSize.QuadPart);
}
// did we find a directory?
// ffd.dwFileAttributes says this is a directory (FILE_ATTRIBUTE_DIRECTORY)
if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& (_tcscmp(ffd.cFileName, _T(".")) != 0 && (_tcscmp(ffd.cFileName, _T("..")) != 0)))
{
TCHAR fullpath[MAX_PATH];
StringCchCopy(fullpath, strlen(szDir) - 0, szDir);
StringCchCat(fullpath, MAX_PATH, ffd.cFileName);
StringCchCat(fullpath, MAX_PATH, "\\");
_tprintf(_T("<DIR> %s \n"), fullpath);
StringCchCat(fullpath, MAX_PATH, _T("*"));
showdir(fullpath);
}
// continue the search; try to find more files
}
// figure out if we encountered an error other than "no more files"
dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES)
{
ReportError(_T("Error in searching"), 4, TRUE);
}
FindClose(hFind);
}
#包括“Everything.h”
#包括“Strsafe.h”
WIN32_查找_数据ffd;
句柄hFind=无效的句柄值;
大整数文件大小;
德沃德误差;
无效显示目录(TCHAR*szDir);
int_tmain(int argc,LPCTSTR argv[])
{
TCHAR szDir[MAX_PATH];
长度法尺寸;
//验证参数的数量
如果(argc!=2)
{
ReportError(_T(“错误:参数数量不正确”),1,FALSE;
}
//获取输入目录的长度
字符串长度(argv[1]、最大路径和长度);
//请验证目录路径是否过长
如果(lengthOfArg>最大路径-2)
{
ReportError(_T(“错误:目录太长”),2,FALSE);
}
//在目录路径的末尾附加一个星号(通配符搜索字符)
StringCchCopy(szDir,MAX_PATH,argv[1]);
StringCchCat(szDir,最大路径,_T(“*”);
showdir(szDir);
}
无效显示目录(TCHAR*szDir)
{
//开始搜索;查找目录中的第一个文件
hFind=FindFirstFile(szDir和ffd);
if(hFind==无效的句柄值)
{
报告错误(_T(“搜索错误”),3,为真;
}
//hFind=FindFirstFile(szDir和ffd);
while(FindNextFile(hFind,&ffd)!=0)
{
if((ffd.dwFileAttributes和文件属性目录)==0)
{
fileSize.LowPart=ffd.nFileSizeLow;
fileSize.HighPart=ffd.nFileSizeHigh;
_tprintf(_T(“%s%ld\n”)、ffd.cFileName、fileSize.QuadPart);
}
//我们找到目录了吗?
//dwFileAttributes表示这是一个目录(文件\属性\目录)
if((ffd.dwFileAttributes和文件属性目录)
&&(_tcscp(ffd.cFileName,_T(“.”)!=0&(_tcscp(ffd.cFileName,_T(“…”)!=0)))
{
TCHAR全路径[最大路径];
StringCchCopy(完整路径,strlen(szDir)-0,szDir);
StringCchCat(完整路径、最大路径、ffd.cFileName);
StringCchCat(完整路径,最大路径,“\”);
_tprintf(_T(“%s\n”),完整路径);
StringCchCat(完整路径,最大路径,_T(“*”);
showdir(完整路径);
}
//继续搜索;尝试查找更多文件
}
//找出我们是否遇到了“不再有文件”以外的错误
dwError=GetLastError();
if(dwError!=错误\u无\u更多\u文件)
{
报告错误(_T(“搜索错误”),4,真);
}
FindClose(hFind);
}
您的全局变量
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
LARGE_INTEGER fileSize;
DWORD dwError;
都应该是showdir()
的局部变量。
然后,每个递归级别都有自己的搜索句柄,当一个嵌套的showdir()
返回,调用的showdir()
只需继续枚举其目录即可
还要注意,您的代码会忽略每个目录中的第一个文件(结果)
属于FindFirstFile()
)。您可以将其重写为(为简洁起见,省略错误检查):
在递归之前,将整个目录详细信息读入数组或链表。这样你就可以更容易地从你离开的地方继续下去。@WeatherVane:当然,这也是一个可能的解决办法。在任何情况下,状态信息(
WIN32\u FIND\u DATA
或数组+当前索引)必须是函数的本地信息。
hFind = FindFirstFile(szDir, &ffd);
do {
// ... handle ffd ...
} while (FindNextFile(hFind, &ffd))