注意:由于问题已解决,我已在原始帖子中添加了评论。
根据“ 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:去提高你的英语。
先感谢您。