我嘗試編寫查找當前diretory中所有文件及其子目錄的應用程序。我有一個問題,我不能完全理解使用遞歸獲取某個目錄中的所有文件
- 我如何需要使用遞歸函數
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:\\*");
}
禁止不必要的代碼很多,(1)你是不是佔 ''和'..',它們都是由您使用的FindXXXX系列函數返回的。你不想枚舉這些。 (2)只要你到達301'st文件,這就是UB。 – WhozCraig
這段代碼有很多問題。看看is_directory的開始。它有一個緩衝區溢出。它泄漏了一個搜索句柄。並且未能檢查FindFirstFile的重試值。手工串工作只是奇怪。 –
@David Heffernan如果這段代碼沒有問題,我就不會在那裏分享它。感謝您的幫助。我已經知道'voila'的語法。 – abilash