【问题标题】:C++ Should I check whether a file exists before deleting it? [closed]C ++我应该在删除文件之前检查文件是否存在吗? [关闭]
【发布时间】:2016-12-02 21:46:29
【问题描述】:

很简单,我想删除一个可能存在也可能不存在的文件。只使用 remove(filename) 并忽略返回值是不好的做法吗?

编辑:通过删除,我指的是this

【问题讨论】:

  • 忽略返回值是总是不好的做法,尤其是在处理系统调用时。
  • 是的..你知道的,不用问我们XD
  • LBYL or EAFP in Java? 答案一般适用——它不依赖于Java。无论如何,您都必须尝试删除该文件——它可能出现在您检查和删除它之间。

标签: c++ c file delete-file


【解决方案1】:

在删除文件之前是否应该检查文件是否存在?

没有这样的要求或需要,这样做毫无用处。

并忽略返回值?

通常,用户可能想知道文件是否被删除,因此忽略返回值通常是个坏主意。此外,用户可能还想知道为什么文件没有被删除(参见std::perror)。

【讨论】:

  • 除非有问题的文件是例如内部临时文件或类似文件。如果返回码没有区别,则无需检查。
【解决方案2】:

一旦你不能只锁定文件系统

  1. 检查文件是否存在
  2. 删除它

你不能保证1之后检查文件没有被另一个进程删除。

所以你应该:

  1. 调用remove函数
  2. 获取renurn值
  3. 检查是否有错误
  4. [使用perror 调用显示错误文本]

【讨论】:

    【解决方案3】:

    您的问题的答案确实取决于您的程序,您提供的链接非常有帮助。如果您的程序很简单,我不会这样做,但如果您的程序很重要,我会检查值,就像 cpluslplus.com 所做的那样,因为您总是应该检查返回值。不这样做是不好的,因为这就像在说:“我不会检查这个函数的返回值,并且故意不涵盖所有可能性。”

    【讨论】:

      【解决方案4】:

      C++ 删除文件前是否应该检查文件是否存在?

      可以,但您应该从不依赖代码中的结果。您可以在您的代码和可能在同一文件上竞争的其他线程/应用程序之间引入竞争条件。考虑以下几点:

      1. 应用程序#1 检查foo.txt 是否存在。结果是真的。
      2. 应用程序#2 检查foo.txt 是否存在。结果是真的。
      3. 应用程序#1 删除foo.txt。成功!
      4. 应用程序#2 删除foo.txt。哎呀!

      只使用 remove(filename) 是不好的做法...

      不,一点也不。

      ...忽略返回值?

      您想要忽略系统调用的返回码的唯一情况是当您真的不关心结果时,这确实非常罕见。删除文件时,您应该记录返回值,然后如果/当文件无法删除时(例如权限问题,已删除等),您可以通知用户操作失败或记录它以进行调试。

      【讨论】:

        【解决方案5】:

        这是一个很难回答的问题。如果您不关心文件是否实际被删除,但无论如何,请忽略返回值。如果不检查返回值,则无法保证文件是否已被删除。最有可能的是,但如果它由于某种原因被锁定怎么办?那你可能有麻烦了。正如有人指出的那样,不检查返回码是一个非常受欢迎和希望的场景。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-16
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-07
          相关资源
          最近更新 更多