C++ 为什么`boost::filesystem::exists`当文件确实存在时返回false?

C++ 为什么`boost::filesystem::exists`当文件确实存在时返回false?,c++,boost,C++,Boost,我的应用程序按预期运行。换句话说,如果文件不完整,我的应用程序将重试,然后成功处理完成的日志文件 案例二: 第一个日志文件不完整(即没有结尾作为最后一行) 我使用vi在末尾手动插入一行,同时应用程序不断检查以下行: $echo "END" >> /tmp/hello.log const boost::filesystem::path文件名(“/tmp/hello.log”); 如果(boost::filesystem::exists(fileName)) { //做某事 } 其他的

我的应用程序按预期运行。换句话说,如果文件不完整,我的应用程序将重试,然后成功处理完成的日志文件

案例二:

第一个日志文件不完整(即没有结尾作为最后一行) 我使用
vi
在末尾手动插入一行,同时应用程序不断检查以下行:

$echo "END" >> /tmp/hello.log
const boost::filesystem::path文件名(“/tmp/hello.log”);
如果(boost::filesystem::exists(fileName))
{
//做某事
}
其他的
{

std::cout可能是您的程序没有足够的权限来统计文件,或者由于其他原因,统计文件的请求失败

在boost的文档中,请注意
exists()
函数的返回值取决于stat操作是否返回错误

bool存在(文件状态)无异常

返回:status_known(s)和&s.type()!=文件未找到

bool状态已知(文件状态)无异常

返回:s.type()!=状态\错误

当文件确实存在时,为什么
boost::filesystem::exists
返回false

不会。该文件不存在


您会说,除非您在vi中执行编辑,否则这是有效的。请记住,vi不是一个简单的命令行工具,而是一个功能强大的文本编辑器。它很可能使用一个临时文件(例如,
/tmp/hello.log~
)用于修改。在保存更改之前,这些更改将不会在
/tmp/hello.log
中找到。您应该研究vi的文档,以了解其工作原理的更多信息。

首先,当您在vi中编辑文件时,您确实打开了
/tmp/hello.log
文件?而不仅仅是在其他路径中的
vi hello.log
?其次是您显示的代码不会检查文件是否“不完整”,只是检查它是否存在。甚至“不完整”文件也存在。我猜vi会创建一个备份副本,即首先
hello.log
重命名为
hello.log~
(或类似),然后使用新内容编写
hello.log
。在这两个事件之间,您的程序将找不到文件。1>我使用
vi/tmp/hello.log
2>手动打开/tmp/hello.log,我没有显示检查完成的代码,因为我只在发现文件确实存在后才检查完成。在我的系统中,vi将生成一个te临时文件为/tmp/.hello.log.swpthere@q0987:当您在vi中键入“:x”(或“:w”)时,它会将更改写入hello.log.swp,然后将hello.log.swp重命名为hello.log。如果您尝试检测该文件是否存在,filesystem::exists可能会返回false。
$echo "END" >> /tmp/hello.log
        const boost::filesystem::path fileName( "/tmp/hello.log" );
        if ( boost::filesystem::exists( fileName ) )
        {
            // do sth
        }
        else
        {
            std::cout << "file doesn't exist: " << std::endl;
        }