为啥当文件确实存在时`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 时它确实有效?