获取目录列表

问题描述:

我遇到了一段时间我试图解决的向量问题。我会马上发布代码,然后解释它。获取目录列表

#include "filesystem.h" 
#include <vector> 
using namespace Filesystem; 

wchar_t** Path::ListDir() 
{ 
    /*struct dirEntry 
    { 
     wchar_t entry[MAX_PATH]; 
    };*/ 
    vector<wchar_t*> pathList = vector<wchar_t*>(); 
    WIN32_FIND_DATA findData; 
    HANDLE dirHandle = new HANDLE; 
    wchar_t* path = L"C:\\*"; 

    dirHandle = FindFirstFile(path, &findData); 
    if (dirHandle == INVALID_HANDLE_VALUE) 
     return NULL; 

    while (FindNextFile(dirHandle, &findData) != 0) 
    { 
     pathList.push_back(findData.cFileName); 
    } 

    FindClose(dirHandle); 

    return NULL; 
} 

这是我正在编写的文件系统类的一部分。它应该列出目录中的所有文件并将它们作为二维字符串数组返回。如果我这样做,它将用最后一个文件填满文件夹中文件数量的列表。这不是我想要的。我认为这可能是因为我提供了一个指向push_back的指针,但我还没有找到解决这个问题的方法。我在Windows上编码,顺便说一句。

如果这里有人对如何做到这一点有任何想法,这将是很好的。

您正在将findData.cFileName的地址存储在vector N次。

您需要复制此内容。可能使用:

vector<std::wstring> pathList; 

编辑:其他小点:

vector<wchar_t*> pathList; 
HANDLE dirHandle; 

如果必须返回wchar_t**然后(例如):

vector<wchar_t*> pathList = vector<wchar_t*>(); 
HANDLE dirHandle = new HANDLE; 

可以替换

// '+1' for NULL terminating string as the callers needs 
// know where the array ends. 
wchar_t** result = new wchar_t*[pathList.size() + 1]; 
*(result + pathList.size()) = 0; 

for (size_t i = 0; i < pathList.size(); i++) 
{ 
    wchar_t* name = new wchar_t[pathList[i].length() + 1]; 
    std::copy(pathList[i].begin(), pathList[i].end(), name); 
    *(name + pathList[i].length()) = L'\0'; 
    *(result + i) = name; 
} 

return result; 

调用者必须记住delete[]返回数组:

Path p; 
wchar_t** list = p.ListDir(); 
... 
for (size_t i = 0; 0 != *(list + i); i++) 
{ 
    delete[] *(list + i); 
} 
delete[] list; 

虽然因为这是C++,你应该使用std::vector<std::wstring>

+0

非常爱!你让我今天很开心! :D 2天的编码,你终于给了我答案! – Soulzter 2012-01-05 16:20:04

+0

你能解释为什么这个工作正常吗? – Soulzter 2012-01-05 16:20:42

+0

由于vector的元素是'std :: wstring',它在'push_back'时取得'findData.cFilename'引用的字符串的一个副本。 – hmjd 2012-01-05 16:26:57

在你的解决方案中,向量中的每个指针都是相同的,并指向最后一个cString(它大致指向堆栈上的findData实例)。在调用FindNextFile()后,您必须复制其结果。试试这样的:

std::vector<std::wstring> pathList; 
//... 
{ 
    pathList.push_back(std::wstring(findData.cFileName)); 
} 

没有编译它我自己。但你在这里有一个粗略的想法。