Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印给定路径中的所有文件和子目录_C_Windows_Recursion - Fatal编程技术网

C 打印给定路径中的所有文件和子目录

C 打印给定路径中的所有文件和子目录,c,windows,recursion,C,Windows,Recursion,因此,我正在编写一个程序,以递归方式打印给定路径中的目录/子目录和文件。我可以进入第一个子目录并打印其中的所有文件。我现在的问题是,我需要找到一种方法,退一步,从我停止阅读的地方继续。直到条件在原始目录级别发生 #include "Everything.h" #include "Strsafe.h" WIN32_FIND_DATA ffd; HANDLE hFind = INVALID_HANDLE_VALUE; LARGE_INTEGER fileSize; DWORD

因此,我正在编写一个程序,以递归方式打印给定路径中的目录/子目录和文件。我可以进入第一个子目录并打印其中的所有文件。我现在的问题是,我需要找到一种方法,退一步,从我停止阅读的地方继续。直到条件在原始目录级别发生

#include "Everything.h"
#include "Strsafe.h"

WIN32_FIND_DATA ffd;
HANDLE          hFind = INVALID_HANDLE_VALUE;
LARGE_INTEGER   fileSize;
DWORD           dwError;

void showdir(TCHAR *szDir);

int _tmain(int argc, LPCTSTR argv[])
{


    TCHAR           szDir[MAX_PATH];
    size_t          lengthOfArg;

    // verify number of parameters
    if (argc != 2)
    {
        ReportError(_T("Error: Incorrect number of arguments"), 1, FALSE);
    }

    // get the length of the entered directory
    StringCchLength(argv[1], MAX_PATH, &lengthOfArg);

    // verify that the directory path is not too long
    if (lengthOfArg > MAX_PATH - 2)
    {
        ReportError(_T("Error: Directory too long"), 2, FALSE);
    }

    // attach an asterisk (wildcard search char) to end of directory path
    StringCchCopy(szDir, MAX_PATH, argv[1]);
    StringCchCat(szDir, MAX_PATH, _T("*"));

    showdir(szDir);
}

void showdir(TCHAR *szDir)
{
    // begin the search; find the first file in the directory
    hFind = FindFirstFile(szDir, &ffd);
    if (hFind == INVALID_HANDLE_VALUE)
    {
        ReportError(_T("Error in searching"), 3, TRUE);
    }

    //hFind = FindFirstFile(szDir, &ffd);
    while (FindNextFile(hFind, &ffd) != 0)
    {
        if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
        {
            fileSize.LowPart = ffd.nFileSizeLow;
            fileSize.HighPart = ffd.nFileSizeHigh;
            _tprintf(_T("%s   %ld\n"), ffd.cFileName, fileSize.QuadPart);

        }       

        // did we find a directory?
        // ffd.dwFileAttributes says this is a directory (FILE_ATTRIBUTE_DIRECTORY)

        if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            && (_tcscmp(ffd.cFileName, _T(".")) != 0 && (_tcscmp(ffd.cFileName, _T("..")) != 0)))
        {
            TCHAR fullpath[MAX_PATH];

            StringCchCopy(fullpath, strlen(szDir) - 0, szDir);
            StringCchCat(fullpath, MAX_PATH, ffd.cFileName);
            StringCchCat(fullpath, MAX_PATH, "\\");
            _tprintf(_T("<DIR>  %s \n"), fullpath);
            StringCchCat(fullpath, MAX_PATH, _T("*"));



            showdir(fullpath);

        }   
        // continue the search; try to find more files
    } 

    // figure out if we encountered an error other than "no more files"
    dwError = GetLastError();

    if (dwError != ERROR_NO_MORE_FILES)
    {
        ReportError(_T("Error in searching"), 4, TRUE);
    }

    FindClose(hFind);

}
#包括“Everything.h”
#包括“Strsafe.h”
WIN32_查找_数据ffd;
句柄hFind=无效的句柄值;
大整数文件大小;
德沃德误差;
无效显示目录(TCHAR*szDir);
int_tmain(int argc,LPCTSTR argv[])
{
TCHAR szDir[MAX_PATH];
长度法尺寸;
//验证参数的数量
如果(argc!=2)
{
ReportError(_T(“错误:参数数量不正确”),1,FALSE;
}
//获取输入目录的长度
字符串长度(argv[1]、最大路径和长度);
//请验证目录路径是否过长
如果(lengthOfArg>最大路径-2)
{
ReportError(_T(“错误:目录太长”),2,FALSE);
}
//在目录路径的末尾附加一个星号(通配符搜索字符)
StringCchCopy(szDir,MAX_PATH,argv[1]);
StringCchCat(szDir,最大路径,_T(“*”);
showdir(szDir);
}
无效显示目录(TCHAR*szDir)
{
//开始搜索;查找目录中的第一个文件
hFind=FindFirstFile(szDir和ffd);
if(hFind==无效的句柄值)
{
报告错误(_T(“搜索错误”),3,为真;
}
//hFind=FindFirstFile(szDir和ffd);
while(FindNextFile(hFind,&ffd)!=0)
{
if((ffd.dwFileAttributes和文件属性目录)==0)
{
fileSize.LowPart=ffd.nFileSizeLow;
fileSize.HighPart=ffd.nFileSizeHigh;
_tprintf(_T(“%s%ld\n”)、ffd.cFileName、fileSize.QuadPart);
}       
//我们找到目录了吗?
//dwFileAttributes表示这是一个目录(文件\属性\目录)
if((ffd.dwFileAttributes和文件属性目录)
&&(_tcscp(ffd.cFileName,_T(“.”)!=0&(_tcscp(ffd.cFileName,_T(“…”)!=0)))
{
TCHAR全路径[最大路径];
StringCchCopy(完整路径,strlen(szDir)-0,szDir);
StringCchCat(完整路径、最大路径、ffd.cFileName);
StringCchCat(完整路径,最大路径,“\”);
_tprintf(_T(“%s\n”),完整路径);
StringCchCat(完整路径,最大路径,_T(“*”);
showdir(完整路径);
}   
//继续搜索;尝试查找更多文件
} 
//找出我们是否遇到了“不再有文件”以外的错误
dwError=GetLastError();
if(dwError!=错误\u无\u更多\u文件)
{
报告错误(_T(“搜索错误”),4,真);
}
FindClose(hFind);
}
您的全局变量

WIN32_FIND_DATA ffd;
HANDLE          hFind = INVALID_HANDLE_VALUE;
LARGE_INTEGER   fileSize;
DWORD           dwError;
都应该是
showdir()
的局部变量。 然后,每个递归级别都有自己的搜索句柄,当一个嵌套的
showdir()
返回,调用的
showdir()
只需继续枚举其目录即可

还要注意,您的代码会忽略每个目录中的第一个文件(结果) 属于
FindFirstFile()
)。您可以将其重写为(为简洁起见,省略错误检查):


在递归之前,将整个目录详细信息读入数组或链表。这样你就可以更容易地从你离开的地方继续下去。@WeatherVane:当然,这也是一个可能的解决办法。在任何情况下,状态信息(
WIN32\u FIND\u DATA
或数组+当前索引)必须是函数的本地信息。
hFind = FindFirstFile(szDir, &ffd);
do {

    // ... handle ffd ...

} while (FindNextFile(hFind, &ffd))