我似乎遇到了一个奇怪的错误,我已将其范围缩小为在 Windows 7 和 8 中 readdir() 失败(并且永远不会返回),但仅在与 Chrome 应用程序的本机消息一起使用时,并且仅在随机但具体数量的文件在目录中。相关的 C++ 代码是:
char ac[10000];
std::string sData = "C:/TEST";
DIR * pdir = NULL;
struct dirent * pdirent = NULL;
if( ( pdir = opendir(sData.c_str()) ) != NULL ){
while( pdirent = readdir(pdir) ){
sReply += "|";
sprintf(ac ,"%s" , pdirent->d_name);
sReply += ac;
}
sReply += "|";
closedir(pdir);
}
当作为控制台应用程序的一部分时,它可以正常工作,并且在大多数情况下,当可执行文件的一部分从 Chrome 打包应用程序接收本机消息时,它可以正常工作 - 它获取并返回一个文本字符串,其中包含目录中的所有文件名,由分隔“|”。
我在我的 Chrome 应用程序中编写了一个测试,在两次试验之间一次添加一个文件。它可以工作多次,但每次添加一些文件后都会失败。例如,如果目录包含文件 Tryc_3.txt、Tryc_4.txt、Tryc_5.txt ... Tryc_65.txt(每个都包含文本“test”),那么目录列表就可以正常工作。如果我然后添加 Tryc_66.txt 它会失败,在 readdir(pdir)。
我尝试了不同的文件名和目录,结果相同,但失败发生在其他数量的文件上。我尝试过 FindFirstFile、FindNextFile 和 FindClose,结果完全相同。我尝试用 Wow64DisableWow64FsRedirection 和 Wow64RevertWow64FsRedirection 包装整个事情,结果完全相同。(我试过 readdir_r 但无法编译它,有些网站似乎说这在 Windows 中不可用)。
我没有想法,很高兴听到任何人的任何线索或猜测。
我可以提供完整的代码,包括 Chrome 应用程序,但即使在我尽可能多地削减之后它也相当大。
为什么目录列表仅在与 Native Messaging 一起使用时才会失败?