Windows:文件重命名和目录迭代冲突

Posted

技术标签:

【中文标题】Windows:文件重命名和目录迭代冲突【英文标题】:Windows: File rename and directory iteration *** 【发布时间】:2010-08-04 12:10:20 【问题描述】:

我正在使用 boost::filesystem 来重命名这样的文件:

boost::filesystem::rename(tmpFileName, targetFile);

tmpFileName / targetFile 的类型为 boost::filsystem::path。

在执行此操作时,我在另一个线程中使用此代码迭代目录:

directory_iterator end_itr;
for (directory_iterator itr(dirInfoPath); itr != end_itr; ++itr)

    path currentPath = itr->path();
    if (is_directory(itr->status()))
    
        // skip directories
    
    else 
    
        std::string file_name = currentPath.leaf();
        if (!boost::algorithm::starts_with(file_name, "new") 
            && !boost::algorithm::starts_with(file_name, "finished")
            && boost::algorithm::ends_with(file_name, ".info"))
            
                // save found filename in some variable
                return true;
            
        
    

执行此代码时,重命名时出现异常:

boost::filesystem::rename: The process cannot access the file because it is being used by another process

迭代和重命名操作是否可能发生冲突,因为它们都访问目录inode,还是我有其他问题?

【问题讨论】:

【参考方案1】:

您提供的代码不包含任何文件打开操作,因此它不能lock 文件。你遍历directory 并重命名file,对吗?所以这个文件可能真的被 另一个 应用程序(如文件查看器或其他东西)使用,这是非常典型的错误。或者你在其他地方的应用中打开它

【讨论】:

以上是关于Windows:文件重命名和目录迭代冲突的主要内容,如果未能解决你的问题,请参考以下文章

以最小的开销重命名目录的所有内容

重命名没有正确分配名称的文件

在Windows中重命名多个文件

Windows批处理文件,如何重命名和删除部分文件名

使用 Windows 批处理脚本重命名目录中的所有文件

使用 Windows 批处理脚本重命名目录中的所有文件