boost :: filesystem :: exists是否确实为没有介质的可移动介质设备抛出异常?

问题描述 投票:7回答:3

我在使用boost :: filesystem :: exists时遇到了一种奇怪的情况。如果尝试检查驱动器上尚未准备就绪或其中没有介质的文件是否存在,则会引发basic_filesystem_error。就我所关心的bfs :: exists的大多数用途而言,如果驱动器尚未准备就绪,则意味着该文件不存在。

我可以使用try-catch来包装我的调用以正确处理这种情况,但是它变得有些麻烦,并使代码有些笨拙。更糟糕的是,这意味着我正在使用basic_filesystem_error的一种特殊情况进行流控制,这意味着,如果引起该异常的其他原因,我将无法再进行适当处理。

通常会出现这种情况,如果我尝试检查CD或DVD驱动器上是否存在文件。我的代码曾经是:

if( bfs::exists( myFilePath ) )
{
...
}

成为:

bool fileExists( false );
try
{
   fileExists = bfs::exists( myFilePath );
}
catch( bfs::basic_filesystem_error<bfs::path> e )
{
   fileExists = false;
}
if( fileExists )
{
...
}

我并不太着迷于在现有代码库中的各处进行此更改的想法。

我正在考虑在包装try-catch的地方制作一个单独的函数,并用它替换我的bfs :: exist调用,但是我仍然不满意以这种方式使用try-catch是一个好主意。似乎我正在为错过更重要和相关的特殊条件敞开大门。

我知道您可以为该函数的非抛出版本重新编译boost,但是我认为这并不能真正避免我的异常处理问题。

以前有没有人遇到过可移动介质驱动器的问题,如果可以,您是如何解决的?

c++ boost boost-filesystem
3个回答
5
投票

根据文档,exists(file_status s) returnsstatus_known(s) && s.type() != file_not_found”。

The documentation also states that

如果基础文件系统在[file_status]属性确定期间报告错误:

  • 如果指示无法解决p的错误,好像是由于POSIX错误ENOENT [即,未找到] ...返回file_status(not_found_flag)

在我看来,抛出异常不是预期的行为。 (当您创建status对象时,其状态是已知的,并且该状态为not_found。)>

但是,文档继续说:

[[注:此行为的作用是在知道p不存在和无法确定p的状态之间进行区分。这种区别对用户很重要。 --end注释]

这暗示库does

打算在“文件不存在”和“我无法确定文件不存在”之间进行区分。您可能希望与图书馆的作者联系以获得更清晰的陈述。

但是,测试文件是否存在是一种竞争条件:从操作系统的角度看,该文件可能已经存在,但不能保证它会继续存在;同样,当操作系统查看时,该文件可能不存在,但不能保证该文件将继续不存在。 The race condition can have security implications

而是打开文件,然后查看其属性。打开文件后,操作系统将对哪些内容会更改以及哪些内容不会更改做出某些保证。


2
投票

这是一个错误,可能与以下内容有关:


0
投票

我终于通过重新编译boost消除了这种烦恼,并将更新的文件系统.lib文件重新链接到我的项目中

© www.soinside.com 2019 - 2024. All rights reserved.