读取C ++中的所有文件已被停止。文件夹

时间:2018-07-26 13:11:25

标签: c++ windows recursion

我想创建一个循环遍历给定文件夹(大多数情况下为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上运行。我该怎么做才能防止此错误的发生?

1 个答案:

答案 0 :(得分:1)

排除名称为“。”的目录。 (当前目录)和搜索中的“ ..”(父目录),可能的解决方案:

if( data->cFileName[0] == '.' and ( data->cFileName[1] == 0 or 
        ( data->cFileName[1] == '.'  and data->cFileName[2] == 0 ) ) )
    continue;