加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 递归文件搜索

发布时间:2020-12-16 09:24:06 所属栏目:百科 来源:网络整理
导读:我正在试图弄清楚如何解决这个问题……出于某种原因,它在某个时刻结束了……我不太擅长递归,我确信问题出在某处…… 此外,即使我检查了cFileName!=“..”,它仍然显示在最后,不知道为什么,但“.”不再显示.. void find_files( wstring wrkdir ){ wstring tem
我正在试图弄清楚如何解决这个问题……出于某种原因,它在某个时刻结束了……我不太擅长递归,我确信问题出在某处……

此外,即使我检查了cFileName!=“..”,它仍然显示在最后,不知道为什么,但“.”不再显示..

void find_files( wstring wrkdir )
{
    wstring temp;

    temp = wrkdir + L"" + L"*"; 
    fHandle = FindFirstFile( temp.c_str(),&file_data );

    if( fHandle == INVALID_HANDLE_VALUE )
    {
         return;
    }
    else 
    { 
        while( FindNextFile( fHandle,&file_data ) ) 
        {
            if( file_data.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
                wcscmp(file_data.cFileName,L".") != 0 && 
                        wcscmp(file_data.cFileName,L"..") != 0 )
            {
                find_files( wrkdir + L"" + file_data.cFileName  );
            }
            else if( file_data.dwFileAttributes != FILE_ATTRIBUTE_HIDDEN && 
                 file_data.dwFileAttributes != FILE_ATTRIBUTE_SYSTEM  )
            {
                results << wrkdir << "" << file_data.cFileName << endl;
            }
        }
    }
}

更改后,程序不会枚举剩下的剩余文件..

例如,如果有一个名为test的子文件夹,它会枚举test中的所有内容,但不会完成枚举指定的原始目录中的文件.

解决方法

从 FindFirstFile文档:

If the function fails or fails to
locate files from the search string in
the lpFileName parameter,the return
value is INVALID_HANDLE_VALUE and the
contents of lpFindFileData are
indeterminate.

您应该只退出一次迭代而不是整个程序:

if( fHandle == INVALID_HANDLE_VALUE )
   {
     return;
   }

这可能会解决您的其他问题:

else if( file_data.dwFileAttributes != FILE_ATTRIBUTE_HIDDEN && 
   file_data.dwFileAttributes != FILE_ATTRIBUTE_SYSTEM  &&
   wcscmp(file_data.cFileName,L".") != 0 && 
   wcscmp(file_data.cFileName,L"..") != 0
 )
{
    results << wrkdir << "" << file_data.cFileName << endl;
}

另请参阅@ fretje的答案.它给你的代码带来了另一个问题.

更新新:您需要将fHandle用作局部变量,而不是全局变量.

改成:

HANDLE fHandle = FindFirstFile( temp.c_str(),&file_data );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读