2013-03-21 47 views
1

注意:由于问题已解决,因此我在原始帖子中添加了评论。何时调用_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的文档含糊不清。

- 评论:去提高你的英语水平。

预先感谢您。

回答

4

您打给_findclose的电话应该与您拨打_findfirst的电话相匹配 - 即每次拨打_findfirst时,您应该拨打电话_findclose

在上面的代码中,由于您只有一个呼叫_findfirst,所以只有一个呼叫_findclose是正确的。

如果你正在做递归搜索子目录,然后你想最终当你潜层次多次调用_findfirst,并匹配呼叫_findclose为您完成并提升备份的层次结构。

+0

确实_findclose需要照顾_findnext? “http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx”中的声明使我感到困惑。 – milesma 2013-03-21 03:19:11

+0

@milesma:no - 你调用'_findfirst'一次,然后'_findnext'多次(取决于目录中的文件数量),然后调用'_findclose'一次。将'_findfirst'想象成真正的'_findopen'可能会有所帮助,这更加明显的是对_findclose的调用应该与它匹配。 – 2013-03-21 03:20:48

+0

谢谢。我弹出另一个问题。当调用_findfirst(aaa/bbb/*,...)时,哪个文件夹被锁定?我的调试器显示系统目录“。”由fileinfo(第二个参数)返回。 – milesma 2013-03-21 03:47:42

0

当您完成时,您只需要调用_findclose一次。

在Windows上,如果目录是进程的当前目录,则该目录可能被锁定。尝试拨打_chdir

如果这不起作用......你打开目录中的任何文件吗?打开的文件也可能会锁定目录。

Process Explorer看看您的应用可能很有用。它可以确切地告诉你什么手柄已经打开。

+0

谢谢。我在windows上,我通过_chdir切换目录,但问题仍然存在。 – milesma 2013-03-21 03:44:27