我想创建一个循环遍历给定文件夹(大多数情况下为C :)并提供名称和/或任何给定属性列表的c ++项目。我使用FindFirstFile()成功完成了一个循环,但是在第一次递归之后,我不可避免地进入了一个循环,其中我的路径变为C:\ $ GetCurrent .....,直到strcpy放弃为止。 代码是
// LoopFiles.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <ShellAPI.h>
#include <fstream>
#include <strsafe.h>
void FindAllFiles(LPCSTR path);
int main()
{
FindAllFiles("C:");
return 0;
}
void FindAllFiles(LPCSTR path) {
LPWIN32_FIND_DATAA data = new WIN32_FIND_DATAA();
char searchPath[MAX_PATH] = "";
HANDLE hFind = INVALID_HANDLE_VALUE;
strcpy_s(searchPath, path);
strcat_s(searchPath, "\\*");
hFind = FindFirstFileA(searchPath, data);
do {
if (INVALID_HANDLE_VALUE == hFind)
{
continue;
}
if (data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
strcpy_s(searchPath, path);
strcat_s(searchPath, "\\");
strcat_s(searchPath, data->cFileName);
FindAllFiles(searchPath);
}
else {
std::cout << data->cFileName;
}
} while (FindNextFileA(hFind, data));
}
很明显,此代码在Windows上运行。我该怎么做才能防止此错误的发生?
答案 0 :(得分:1)
排除名称为“。”的目录。 (当前目录)和搜索中的“ ..”(父目录),可能的解决方案:
if( data->cFileName[0] == '.' and ( data->cFileName[1] == 0 or
( data->cFileName[1] == '.' and data->cFileName[2] == 0 ) ) )
continue;