为啥当文件确实存在时`boost::filesystem::exists`返回false?

Posted

技术标签:

【中文标题】为啥当文件确实存在时`boost::filesystem::exists`返回false?【英文标题】:why `boost::filesystem::exists` return false when a file does exist?为什么当文件确实存在时`boost::filesystem::exists`返回false? 【发布时间】:2016-05-17 13:57:54 【问题描述】:
        const boost::filesystem::path fileName( "/tmp/hello.log" );
        if ( boost::filesystem::exists( fileName ) )
        
            // do sth
        
        else
        
            std::cout << "file doesn't exist: " << std::endl;
        

这是我遇到的问题:

在处理日志文件(即/tmp/hello.log)之前,我需要检查文件是否完成。如果文件不完整,我稍后会检查文件。

要运行模拟,我选择以下方法:

案例一:

日志文件首先是不完整的(即最后一行没有END)

$echo "END" >> /tmp/hello.log

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

案例二:

日志文件首先是不完整的(即没有END作为最后一行) 我使用vi 在最后手动插入一行,同时应用程序不断检查以下行:

        const boost::filesystem::path fileName( "/tmp/hello.log" );
        if ( boost::filesystem::exists( fileName ) )
        
            // do sth
        
        else
        
            std::cout << "file doesn't exist: " << std::endl;
        

在我将最后一行附加到文件后,我的应用程序将报告错误并说“文件不存在”。但其实日志文件是有的。

为什么在案例 II 中,boost 函数会返回 false,而在案例 I 中,函数返回 true。

【问题讨论】:

首先,当您在VI中编辑文件时,您是否打开/tmp/hello.log文件?不只是例如vi hello.log 在其他路径中?其次,您显示的代码不会检查文件是否“不完整”,只要它存在即可。甚至存在“不完整”的文件。 我猜 vi 会创建一个备份副本,即首先将 hello.log 重命名为 hello.log~(或类似名称),然后将 hello.log 写入新内容。在这两个事件之间,您的程序将找不到该文件。 1> 我用vi /tmp/hello.log 手动打开/tmp/hello.log 2> 我没有显示检查完成的代码,因为我只在发现文件确实存在后才检查完成。 在我的系统中,vi会生成一个临时文件为/tmp/.hello.log.swp。但是,/tmp/hello.log 仍然存在 @q0987: 当你在 vi 中输入 ":x" (或 ":w") 时,它会将更改写入 hello.log.swp,然后将 hello.log.swp 重命名为 hello 。日志。如果您尝试检测该文件是否存在,则 filesystem::exists 可能会返回 false。 【参考方案1】:

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

不会的。该文件存在。

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

【讨论】:

【参考方案2】:

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

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

bool exists(file_status s) noexcept

返回:status_known(s) && s.type() != file_not_found

bool status_known(file_status s) noexcept

返回:s.type() != status_error

http://www.boost.org/doc/libs/1_60_0/libs/filesystem/doc/reference.html#exists

【讨论】:

以上是关于为啥当文件确实存在时`boost::filesystem::exists`返回false?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到错误消息:“FileExistsError: [WinError 183] 当文件已存在时无法创建文件”?

为啥使用mklink 做目录关联时,提示“当文件已存在时,无法创建该文件”

为啥当我将 SKSpriteNode 与图像一起使用时它不会反弹,但当我使用 SKShapeNode 时它确实有效?

为啥当我从express发送一个简单的文件时,客户端会消耗大量内存?

StreamReader 抱怨文件不存在,但确实存在

为啥当我执行 git subtree push 时它说我拥有的文件不存在?