使用FindFirstFile/FindNextFile的C++代码删除文件夹中所有文件

4
我的目标是删除指定文件夹中的所有文件,但不删除文件夹本身。我考虑调用 FindFirstFile,然后重复调用 FindNextFile,同时删除找到的每个文件,使用以下伪代码:
if(FindFirstFile(FindFileData))
{
    do
    {
        DeleteFile(FindFileData.FileName);
    }
    while(FindNextFile(FindFileData));

    FindClose(FindFileData);   //EDIT for people who didn't see my pseudo-code remark
}

但是现在我在想,如果我在枚举该文件夹时需要删除文件怎么办?换句话说,我是否需要首先缓存所有找到的文件名,然后再删除它们,还是像上面所示的那样做就可以了呢?


2
为什么不测试一下,看看它是否有效呢? - sashoalm
1
对我来说,询问是否有其他人遇到过这个问题更容易。 - c00000fd
为什么不像 DeleteFile 文档中提到的那样使用 http://msdn.microsoft.com/en-us/library/bb762164%28v=vs.85%29.aspx? - Tobias Langner
我认为你对 FindFirstFile 的错误处理是错误的。在出现错误的情况下,它会返回 INVALID_HANDLE_VALUE,即 -1,因此你的 if 分支将被执行。 - Frerich Raabe
1
运行成功的测试并不意味着代码结构正确。这就是我在这里试图建立的。 - c00000fd
显示剩余4条评论
2个回答

2

是的,您可以使用遍历删除文件夹中的文件,前提是您正确获取API和逻辑细节(例如Frerich Raabe的评论)。

因此,您的FindFirstFile将初始化一个WIN32_FIND_DATA结构,并且您的FindNextFile将引用相同的结构进行定位。只要不破坏它,您可以随时删除文件。


1
不要忘记注意 WIN32_FIND_DATA 实际报告的细节。不要尝试在文件夹上调用 DeleteFile(),而且 cFileName 字段仅为文件名本身,因此在调用 DeleteFile() 时必须手动在其前面添加完整的文件夹路径。 - Remy Lebeau
@RemyLebeau:是的,当然。我已经注明上面的代码示例只是伪代码了。 - c00000fd
你有这些删除操作的安全性参考资料吗? - xuhdev

1

FindFirstFile返回一个句柄,如果它有效,应该使用FindClose释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接