boost::filesystem::relative() 无法访问该文件,因为它正在被另一个进程使用

2024-01-10

当访问某些网络驱动器时,函数relative(path, base_path) and canonical(path, base_path)抛出异常。消息始终是:

该进程无法访问该文件,因为该文件正在被另一个进程使用

我仅在一些由我们 IT 部门运营且包含符号链接的共享网络驱动器上观察到此行为。我无法在本地驱动器或相邻计算机的共享驱动器上引发相同的问题。我们怀疑网络驱动器上使用的存档/备份解决方案也是这里的驱动程序。到目前为止,已知的因素如下:

  • 该驱动器必须是网络共享(驱动器等)
  • 该路径需要包含符号链接组件
  • 该驱动器在备份/归档解决方案下运行

我的问题是:

  • 这是一个潜在的错误吗boost::filesystem?
  • 有潜力吗boost::filesystem我错过了可以解决问题的技巧吗?

一种可能的解决方法是重新实施relative()函数仅使用路径操作并且不访问文件系统。但我想避免重新实施。

如果测试的路径有问题,则可能会出现问题的小示例程序:

#include <vector>
#include <string>
#include <tuple>
#include <boost/filesystem.hpp>
#include <boost/system/error_code.hpp>

using namespace std;
using namespace boost::filesystem;
using boost::system::error_code;


int main()
{
    vector<string> testpaths = {
        "< path to a directory which is to test >",
    };

    for(auto & line : testpaths)
    {
        if(line.empty()) continue;   // skip empty lines

        cout << " path: " << line << "   ";

        path testpath(line.c_str());
        // simplified testing, use parent of parent
        path basepath = testpath.parent_path().parent_path();

        boost::system::error_code ec;
        path relpath = relative(testpath, basepath, ec);
        if(ec)  cout << "  ---> error: " << ec.message();
        else    cout << " ok, relative: " << relpath.string();
        cout << endl;
    }
}

我遇到了同样的问题,路径仅包含使用 boost 1.65.1 的目录:

unexpected exception: boost::filesystem::weakly_canonical: The process cannot access the file because it is being used by another process; 

当路径包含符号链接时,这种情况也仅发生在网络驱动器上。

看来这是一个同步问题。显然使用boost:filesystem无法并行访问相同的符号链接。 我定义了一个自定义函数,用于封装并同步对weakly_canonical的访问:

static boost::recursive_mutex   sgCanonicalMutex;

boost::filesystem::path CanonicalPath(const boost::filesystem::path inPath)
{        
        boost::recursive_mutex::scoped_lock lk(sgCanonicalMutex);
        return boost::filesystem::weakly_canonical(inPath);
}

更改后,该问题不再出现。 boost::filesystem::status 的文档中还有关于底层系统错误代码 ERROR_SHARING_VIOLATION 的注释。看https://www.boost.org/doc/libs/1_70_0/libs/filesystem/doc/reference.html https://www.boost.org/doc/libs/1_70_0/libs/filesystem/doc/reference.html

我认为根本原因在于升压源: boost\libs\filesystem\src\operations.cpp

函数 read_symlink 包含

handle_wrapper h(
      create_file_handle(p.c_str(), GENERIC_READ, 0, 0, OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0));

第三个参数(值 0)是传递给 CreateFileW 的 dwShareMode(请参阅https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilew https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilew)。 该参数可能应该是 FILE_SHARE_READ。最新的升压1.70仍然保持不变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost::filesystem::relative() 无法访问该文件,因为它正在被另一个进程使用 的相关文章

随机推荐