注意:由于问题已解决,因此我在原始帖子中添加了评论。何时调用_findclose?
据“http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx”,它说,因为这:
*您必须调用_findclose您正在使用的_findfirst或_findnext函数(或任何变体)完成之后。这将释放在你的应用程序中使用这些功能的资源*
--comment:它是模糊的,但什么微软想说的是:有些用户只需要找到的第一个文件(他们不这样做需要调用_findnext),然后调用_findclose;一些用户调用_findnext(他们必须已经调用_findfirst),在完成使用后,调用_findclose。实际上_findnext可以多次调用,而_findclose只对由_findfirst创建的句柄负责。
以下是广泛用于列出目录中的文件的一段代码。 - 评论:这是正确的。
例如,如果有2个文件,并在目录1名的目录,那么:
.
..
ddd
file1.txt
file2.txt
_findfirst被调用一次。句柄的相应文件信息是系统目录“。”。 (是吗?) - 评论:没有。句柄是一组文件+目录,文件信息充当“光标”。 (fileinfo总是包含“name”字段,我敢打赌_findnext的实现是使用“name”来查找句柄指定的一组文件+目录中的下一个)
_findnext被调用4次。 (第一个参数总是对应于“。”的句柄,是吗?) --comment: yes + no。第一个参数总是相同的句柄;该句柄不对应于任何文件信息,而是与它们的一组相对应。
我的问题是:
是否 “_findclose” 被调用一次就足够了? * - 评论: *是的。
如果_findnext不会改变句柄值,它如何“记住”从哪里开始找到下一个文件(或目录)? (对不起,也许我在想“链接列表”模式)。 * --comment: *我打赌使用fileinfo的名称字段。就像在Windows资源管理器中一样,我们对文件夹中的内容进行排序,给定一个文件名,我们可以知道它们在列表中的位置,因此我们可以“查找下一个”。
有没有什么伤害呼吁_findclose更多的时间比需要? (像崩溃什么的) * - 评论: *一个愚蠢的问题。抱歉!
还是下面的代码错了?如果是,那么实施它的正确方法是什么? - 它是正确的代码。
// 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的文档含糊不清。
- 评论:去提高你的英语水平。
预先感谢您。
确实_findclose需要照顾_findnext? “http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx”中的声明使我感到困惑。 – milesma 2013-03-21 03:19:11
@milesma:no - 你调用'_findfirst'一次,然后'_findnext'多次(取决于目录中的文件数量),然后调用'_findclose'一次。将'_findfirst'想象成真正的'_findopen'可能会有所帮助,这更加明显的是对_findclose的调用应该与它匹配。 – 2013-03-21 03:20:48
谢谢。我弹出另一个问题。当调用_findfirst(aaa/bbb/*,...)时,哪个文件夹被锁定?我的调试器显示系统目录“。”由fileinfo(第二个参数)返回。 – milesma 2013-03-21 03:47:42