访问映射的网络驱动器时,boost 文件系统 create_directories 函数会随机失败

sah*_*sah 5 c++ boost

尝试使用 boost 文件系统 create_directories 函数在映射的网络驱动器中创建文件夹时,出现以下类型的随机错误:“系统找不到指定的路径。”。随机我的意思是有时我得到错误,有时我没有。

是的,我已经检查过:

  • 这是一个有效的路径。
  • 这不是一条太长的路。实际上,我使用 Windows 扩展路径作为 \?\PATH。
  • 网络驱动器工作正常,它位于我们公司的本地网络(千兆以太网)内。
  • 我有写权限。
  • 没有unicode字符。

在代码下方(经过调整以使其更简单)。

#include "boost/filesystem.hpp"
#include <string>
#include <chrono>
#include <thread>
#include <iostream>

#define MAX_RETRIES 10
#define RETRY_TIME 5000 //in millisecond

namespace fs = boost::filesystem;

bool createDirectory(const std::string& folderPath)
{        
    //If the function does not succeed to create the directory in first place, it will retry after RETRY_TIME miliseconds a maximum number of MAX_RETRIES.
    for (unsigned int i=0; i<MAX_RETRIES; i++)
    {
        try
        {
            if (fs::create_directories(fs::path(folderPath)))
            {   
                std::cerr << "Folder created successfully!" << std::endl;             
                return true;
            }
        }
        catch (fs::filesystem_error const & e)
        {
                std::cerr << "File operation problem with files: " << e.what() <<". Try number: "<<i+1<<std::endl;
        }

        if (i==MAX_RETRIES-1)
        {
            return false;
        }

        std::this_thread::sleep_for(std::chrono::milliseconds(RETRY_TIME)); 

    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我试图创建文件夹:

Z:\PRIVATE_FOLDERS\XXX\tests\YYY\ZZZZZ\MMMMMMM\CCCCCC\@mmmm1\@ccccc1\@eeeeeeeee2
Run Code Online (Sandbox Code Playgroud)

(Z 是网络映射驱动器):

这是输出。有时它第一次起作用

Folder created successfully!
Run Code Online (Sandbox Code Playgroud)

有时它会连续失败几次,直到它起作用为止。魔法?

File operation problem with files: "boost::filesystem::create_directories: The system cannot find the path specified: "\\?\Z:\PRIVATE_FOLDERS\XXX\tests\YYY\ZZZZZ\MMMMMMM\CCCCCC\@mmmm1\@ccccc1\@eeeeeeeee2"". try number: 1
File operation problem with files: "boost::filesystem::create_directories: The system cannot find the path specified: "\\?\Z:\PRIVATE_FOLDERS\XXX\tests\YYY\ZZZZZ\MMMMMMM\CCCCCC\@mmmm1\@ccccc1\@eeeeeeeee2"". try number: 2
File operation problem with files: "boost::filesystem::create_directories: The system cannot find the path specified: "\\?\Z:\PRIVATE_FOLDERS\XXX\tests\YYY\ZZZZZ\MMMMMMM\CCCCCC\@mmmm1\@ccccc1\@eeeeeeeee2"". try number: 3
Folder created successfully!
Run Code Online (Sandbox Code Playgroud)

这种实现的问题在于,先验无法区分输入路径是网络驱动器,还是错误路径或没有写入权限。因此,我需要始终花费 MAX_RETRIES 直到它最终失败,随之而来的性能损失。

笔记:

  • 我在 Windows 10 上
  • Boost 版本是基于 VS2015 构建的 1.60,从官网下载。
  • 我将英特尔编译器 17 用于其余代码。