【问题标题】:How to check if file is already opened using boost如何使用boost检查文件是否已经打开
【发布时间】:2015-07-14 11:03:27
【问题描述】:

如果文件未打开,如何使用 boost 检查文件是否已打开,然后删除该文件,否则什么也不做

boost::filesystem::wpath file("c://test.txt");

if(boost::filesystem::exists(file))
{
   if(here i want a check that file is already open or not, if open then run else)
   {
     boost::filesystem::remove(file);
   }
   else
   {

   }
}

【问题讨论】:

  • 您将如何处理在检查和尝试删除文件之间打开文件的情况?
  • 如果它打开了,我不想删除它。
  • 这就是为什么我放评论,我想实现一些代码,如果文件被打开而不是删除它。
  • @ArslanAhmed IInspectable 的观点是:如果文件在您检查时打开怎么办(所以您要删除它),但它 i> 在您尝试删除它时打开?
  • @MikeKinghan 感谢您指出这一点

标签: c++ boost boost-filesystem


【解决方案1】:

操作系统的职责是防止/允许这种情况发生。

每个操作系统都有自己的锁定方式以供独占使用,在这种情况下,无论如何删除都会失败。

其他操作系统 (POSIX) 将取消文件条目与 inode 的链接,并且该文件仍然可供打开该文件的进程访问。当 inode 的最后一次使用消失时,该文件实际上已被删除。

简而言之,不要尝试预先检测,只看删除是否失败。否则你会遇到上面提到的竞态条件

您将如何处理在检查和尝试删除文件之间打开文件的情况? here

您似乎忽略了这一点(看到您的回复),Mike 解释了

【讨论】:

  • 如果文件已经打开则什么也不做,如果没有打开则删除该文件。
  • 你可以,只有通过尝试。 (我怕重复问题不会帮助你理解答案。)
  • @ArslanAhmed:更详细的解释请参见TOCTOU
猜你喜欢
  • 2012-08-30
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
相关资源
最近更新 更多