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

时间:2016-05-17 13:57:54

标签: c++ boost

        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)之前,我需要检查文件是否完成。如果文件不完整,我会稍后检查文件。

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

案例I:

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

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

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

案例II:

首先是日志文件不完整(即没有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;
        }

将最后一行追加到文件后,我的应用程序将报告错误并说“文件不存在”。但事实上,日志文件就在那里。

为什么在Case II中,boost函数将返回false,而在Case I中函数返回true。

2 个答案:

答案 0 :(得分:2)

  

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

不会。该文件存在。

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

答案 1 :(得分:0)

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

从boost的文档中,请注意 BIN=./bin/ SOURCE=./src/ CXX=g++ CXXFLAGS=-g -c -Wall BINARIES=sums-in-loop sum-in-loop sum-of-two RM=rm -f all: sums-in-loop sum-in-loop sum-of-two sums-in-loop: $(CXX) $(CXXFLAGS) $(SOURCE)$@.cpp -o $(BIN)$@ sum-in-loop: $(CXX) $(CXXFLAGS) $(SOURCE)$@.cpp -o $(BIN)$@ sum-of-two: $(CXX) $(CXXFLAGS) $(SOURCE)$@.cpp -o $(BIN)$@ clean: $(RM) $(BIN)* 函数的返回值取决于stat操作是否返回错误。

  

bool存在(file_status s)noexcept

     

返回:status_known(s)&amp;&amp; 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