获取当前目录中的所有文件

时间:2012-10-15 13:35:49

标签: c++ winapi

我尝试编写返回字符串数组的函数(位于某个目录中的所有文件和文件夹)。代码如下。当我使用此代码输出信息到控制台(使用下面的编码代码)时它工作得很好,但是当我尝试返回指向wchar_t的指针时,我获得了每个元素等于enother的数组(所有元素都是相同)。我做错了什么?

wchar_t path[SIZE];
    wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName)
    {
        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);
            //std::wcout << p << std::endl;
            allFlsArr[i++] = p;
            std::wcout << i << std::endl;
        }
        while(FindNextFile(search_hendle, &file));
        allFlsArr[i] = '\0';
    }
    CloseHandle(search_hendle);
    return allFlsArr;
}

1 个答案:

答案 0 :(得分:2)

我怀疑你没有为PathCreator的返回分配内存。这意味着您在每个条目设置相同的指针。当您更改指针位置处的数据时,它会发生变化,并且每个条目都会查看该数据,所有内容都会“更改”。

使用std :: wstring ...

会好得多
std::wstring PathCreator(const std::wstring& dir, wchar_t *fileName)
{
    return dir.substr( 0, dir.size() - 1 ) + fileName;
} 

std::vector< std::wstring > GetAllFiles( const std::wstring& dir)
{
    std::vector< std::wstring > allFlsArr;
    WIN32_FIND_DATA file;
    HANDLE search_handle = FindFirstFile(dir.c_str(), &file);
    if(search_handle)
    {
        do
        {
            std::wstring path = PathCreator(dir,file.cFileName);
            //std::wcout << path << std::endl;
            allFlsArr.push_back( path );
            std::wcout << i << std::endl;
        }
        while(FindNextFile(search_handle, &file));
    }
    CloseHandle(search_handle);
    return allFlsArr;
}

您需要更改PathCreator中的相应代码以使用std :: wstring。

编辑 :如果您真的不使用STL,则需要修改PathCreator以执行以下操作:

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;
}  

完成后,不要忘记删除[]字符串!

但是,你真的是因为没有使用他们提供的STL功能和RAII奖金而给自己造成痛苦。我的方法不需要记住删除之后使用的内存,因为当它超出范围时将自动释放内存。

我真的认为第一种方法更容易了。