【问题标题】:Traversing directories recursivelly using FindFirstFileEx function [closed]使用 FindFirstFileEx 函数递归遍历目录[关闭]
【发布时间】:2012-09-08 20:05:13
【问题描述】:

我已经调试过了,但我仍然不知道什么是罪魁祸首。

#ifndef UNICODE 
#define UNICODE
#endif


#include <stdio.h>
#include <Windows.h>


void EndWithBackslash(TCHAR* string)
{
    if(string[wcslen(string)-1] != TEXT('\\')) wcscat(string,TEXT("\\"));
}


void Browse(const TCHAR* curdir)
{
    HANDLE hFoundFile;
    WIN32_FIND_DATA foundFileData;
    TCHAR buffer[MAX_PATH];

    wcscpy(buffer,curdir);

    EndWithBackslash(buffer);

    SetCurrentDirectory(buffer);

    hFoundFile = FindFirstFileEx(TEXT("*"),FINDEX_INFO_LEVELS::FindExInfoBasic,&foundFileData ,FINDEX_SEARCH_OPS::FindExSearchLimitToDirectories ,NULL , NULL);

    if(hFoundFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            if ((foundFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && wcscmp(foundFileData.cFileName,TEXT(".")) && wcscmp(foundFileData.cFileName,TEXT("..")) )
            {   
                EndWithBackslash(buffer);
                wcscat(buffer,foundFileData.cFileName);
                wprintf(TEXT("%s\n"),buffer);


                Browse(buffer);
            }
        }
        while(FindNextFile(hFoundFile,&foundFileData));
        FindClose(hFoundFile);


    }
}

int main(void) 
{   
    Browse(TEXT("F:\\"));

    system("Pause");
    return 0;
}

输出:

F:\$RECYCLE.BIN
F:\$RECYCLE.BIN\S-1-5-21-1271883188-2384997935-49719322-1000
F:\$RECYCLE.BIN\希捷
F:\$RECYCLE.BIN\Seagate\Seagate Dashboard 2.0
F:\$RECYCLE.BIN\Seagate\Seagate Dashboard 2.0\系统卷信息
F:\$RECYCLE.BIN\Seagate\Seagate Dashboard 2.0\System Volume Information\Video

“第一层”到底长什么样:

你能指出我的错误吗?

【问题讨论】:

  • 对其进行更多调试,特别是在递归调用返回时。
  • 你为什么SetCurrentDirectory?相反,编写完整路径会更容易,并且在调试器下也会更清晰。
  • 如果您在迭代目录时不断使用wcscat 添加越来越多的数据到同一个缓冲区,那么您现在遇到的问题。相反,您需要保持当前 dir 变量不变,并与找到的项目组合成单独的变量。

标签: c winapi windows-7


【解决方案1】:

内部应该是:

            TCHAR pszItemPath[MAX_PATH];
            wcscpy(pszItemPath, buffer);
            // NOTE: Now when we took a copy of buffer, we don't touch it so that next iteration would have it good and untouched
            EndWithBackslash(pszItemPath);
            wcscat(pszItemPath, foundFileData.cFileName);
            wprintf(TEXT("%s\n"), pszItemPath);

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 2019-06-24
    • 1970-01-01
    • 2013-06-01
    • 2010-12-08
    • 2019-03-26
    • 2012-04-07
    • 2018-11-15
    • 2023-01-09
    相关资源
    最近更新 更多