現在のディレクトリとそのサブディレクトリにあるすべてのファイルを検索するアプリケーションを作成しようとしています。完全には理解できない次の問題があります
- 私の場合、どのように再帰
GetFiles()
関数を使用する必要がありますか、そして - 関数内で動的に割り当てられた空きメモリが必要な場合
PathCreator()
。このプログラムを一部のディレクトリ(サブディレクトリなし)でのみテストすると、機能します(コメント付きのコードを参照してください_tmain()
)。しかし、すべてのファイルを取得しようとすると、クラッシュが発生します。
これが私のコードです:
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#define SIZE 300
int is_directory(wchar_t *p)
{
wchar_t temp[300];
int i;
i = 0;
while(*p != '\0')
{
temp[i] = *p;
p++;
i++;
}
temp[i] = '\\';
i++;
temp[i] = '\0';
WIN32_FIND_DATA file;
HANDLE search_hendle = FindFirstFile(temp, &file);
long error = GetLastError();
if(error == 267)
{
return 0;
}
else
{
return 1;
}
}
wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName)
{
wchar_t* path = new wchar_t[SIZE];
int j = 0;
while(j < SIZE)
{
path[j] = '\0';
j++;
}
int i;
i = 0;
while(*dir != '*' && *dir != '\0')
{
path[i] = *dir;
i++;
dir++;
}
wchar_t *t = fileName;
while(*t != '\0')
{
path[i] = *t;
i++;
t++;
}
path[i] = '\0';
return path;
}
wchar_t* allFlsArr[SIZE];
int i = 0;
wchar_t **GetAllFiles(wchar_t* dir)
{
WIN32_FIND_DATA file;
HANDLE search_hendle = FindFirstFile(dir, &file);
if(search_hendle)
{
do
{
wchar_t *p = PathCreator(dir,file.cFileName);
allFlsArr[i++] = p;
}
while(FindNextFile(search_hendle, &file));
allFlsArr[i] = '\0';
}
CloseHandle(search_hendle);
return allFlsArr;
}
void GetFiles(wchar_t *dir)
{
wchar_t **filePaths = 0;
filePaths = GetAllFiles(dir);
int i = 0;
while(filePaths[i] != '\0'){
if(!is_directory(filePaths[i]))
{
std::wcout << filePaths[i] << std::endl;
}
else
{
GetAllFiles(filePaths[i]);
}
}
delete [] filePaths;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*wchar_t **wch = GetAllFiles(L"C:\\*");
int i = 0;
while( *wch != '\0')
{
std::wcout << *wch << std::endl;
wch++;
}*/
GetFiles(L"C:\\*");
}