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。
答案 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