【问题标题】:C++ code to delete all files in a folder with FindFirstFile/FindNextFile使用 FindFirstFile/FindNextFile 删除文件夹中所有文件的 C++ 代码
【发布时间】:2013-07-22 01:44:29
【问题描述】:

我的目标是删除给定文件夹中的所有文件,但不删除文件夹本身。我正在考虑调用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
}

但现在我在想,是否允许我在该文件夹中进行枚举时删除文件?或者换句话说,我需要先缓存所有找到的文件名然后删除它们,还是像我上面显示的那样做?

【问题讨论】:

  • 你为什么不测试一下,看看它是否有效?
  • @sashoalm:对我来说,询问其他人是否遇到它更容易。
  • 为什么不使用 DeleteFile 文档中提到的msdn.microsoft.com/en-us/library/bb762164%28v=vs.85%29.aspx
  • 我认为您对FindFirstFile 的错误处理是错误的。如果出现错误,它会返回INVALID_HANDLE_VALUE,即-1 - 因此您的if 分支将被输入。
  • @enhzflep:运行成功的测试并不意味着代码结构正确。这就是我要在这里建立的。

标签: c++ windows file winapi


【解决方案1】:

是的,您可以使用遍历从文件夹中安全地删除文件 在这些行中,当然前提是您获得了 API 和逻辑详细信息 对(例如 Frerich Raabe 的评论)。

所以你的FindFirstFile 将初始化一个WIN32_FIND_DATA 结构 并且您的 FindNextFile 将引用相同的结构 它的寻路目的。只要你不破坏它 您可以随时删除文件。

【讨论】:

  • 别忘了关注WIN32_FIND_DATA实际报告的细节。不要尝试在文件夹上调用DeleteFile(),而且cFileName 字段本身就是文件名,因此在调用DeleteFile() 时必须在其前面手动添加完整的文件夹路径。
  • @RemyLebeau:是的,当然。我注意到上面的代码示例只是一个伪代码。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2021-11-10
    相关资源
    最近更新 更多