1

注意:由于问题已解决,我已在原始帖子中添加了评论。

根据“ http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx ”,它是这样表述的:

*您必须在使用完 _findfirst 或 _findnext 函数(或任何变体)后调用 _findclose。这可以释放应用程序中这些函数使用的资源。*

--comment:含糊不清,但微软想说的是:有些用户只需要找到第一个文件(他们不需要调用_findnext),然后调用_findclose;一些用户调用了_findnext(他们必须已经调用了_findfirst),用完之后调用_findclose。实际上_findnext可以被多次调用,而_findclose只负责一个句柄,由_findfirst创建。

以下是一段广泛用于列出目录中文件的代码。——评论:是对的。

例如,如果目录中有2个文件和1个目录,那么:

.
..
ddd
file1.txt
file2.txt

_findfirst 被调用一次。句柄对应的fileinfo是系统目录“.” (对吗?) ——评论:不。句柄是一组文件+目录,文件信息充当“光标”。(fileinfo 总是包含“name”字段,我敢打赌 _findnext 的实现是使用“name”在句柄指定的一组文件+目录中查找下一个)

_findnext 被调用 4 次。(第一个参数总是对应于“.”的句柄,对吗?) --comment: yes + no。第一个参数始终是同一个句柄;句柄不对应于任何文件信息,而是对应于其中的一组。

我的问题是:

将“_findclose”称为一次就足够了吗? * --评论: *是的。

如果 _findnext 不会更改句柄值,它如何“记住”从哪里开始查找下一个文件(或目录)?(对不起,也许我在考虑“链表”模式。) * --comment: * 我敢打赌使用的是文件信息的名称字段。就像在 Windows 资源管理器中一样,我们对文件夹中的内容进行排序,给定文件名,我们可以知道它们在列表中的位置,因此我们可以“查找下一个”。

调用 _findclose 比需要的次数多有什么害处吗?(比如崩溃什么的) * --comment: * 一个愚蠢的问题。对不起!

还是下面的代码完全错误?如果是,实现它的正确方法是什么? --这是正确的代码。

// List the files in the directory
intptr_t file;
_finddata_t filedata;
file = _findfirst(desc.c_str(),&filedata);
if (file != -1)
{
  do
  {
    cout << filedata.name << endl;
    // Or put the file name in a vector here
  } while (_findnext(file,&filedata) == 0);
}
else
{
  cout << "No described files found" << endl;
}
_findclose(file);

我之所以问这个问题是因为我遇到了一个问题,即应用程序正在冻结一个目录,如果该进程处于活动状态,则无法删除该目录。但是,我可以保证“_findfirst”的每个返回值都会调用“_findclose”。如果我在调用“_findnext”之后添加“_findclose”,那么将完美地解决问题。你能帮我解释一下吗?

——评论:原谅。不要太容易使用“保证”。这就是错误所在。

注意:我理解什么是句柄没有问题,比如打开文件,读/写/读/写...,关闭文件句柄。我只是发现描述这三个 API 的文档很模糊。

--comment:去提高你的英语。

先感谢您。

4

2 回答 2

4

您对 _findclose 的调用应该与对的调用相匹配_findfirst——即,每次调用 时_findfirst,都应该对_findclose.

在上面的代码中,由于您只有一次对 的调用_findfirst,因此只有一次对 的调用是正确的_findclose

如果您正在对子目录进行递归搜索,那么_findfirst当您下降层次结构时,您最终会得到多个调用,并_findclose在您完成并向上返回层次结构时匹配调用。

于 2013-03-21T03:16:16.273 回答
0

完成后,您只需调用 _findclose 一次。

在 Windows 上,如果一个目录是您进程的当前目录,它可能会被锁定。尝试调用_chdir

如果这不起作用...您是否打开了您正在搜索的目录中的任何文件?打开的文件也可能会锁定目录。

Process Explorer查看您的应用程序可能会很有用。它可以肯定地告诉您您打开了哪个手柄。

于 2013-03-21T03:16:03.747 回答