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

5

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

编辑:通过remove,我指的是这个


忽略返回值总是一个不好的习惯,特别是在处理系统调用时。 - πάντα ῥεῖ
是的,你知道它是什么,不需要问我们 XD - Javant
1
请参阅LBYL或EAFP在Java中?,其中答案通用适用于任何语言,不仅限于Java。您必须尝试删除文件 - 因为它可能会在您检查和删除之间出现。 - Jonathan Leffler
5个回答

2
我应该在删除文件之前检查文件是否存在吗?
没有这样的要求或需要,这样做也没有任何用处。
并且忽略返回值?
通常,用户可能想知道文件是否被删除,因此忽略返回值通常是不好的想法。此外,用户可能还想知道为什么文件没有被删除(请参见std :: perror)。

除非所涉及的文件是内部临时文件或类似文件,否则无需检查返回代码。如果返回代码没有影响,则无需检查它。 - rici

1

一旦您无法仅锁定文件系统以进行以下操作:

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

您无法保证在 1 次检查文件后,该文件未被另一个进程删除。

因此,您应该:

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

0

针对你的问题,答案取决于你的程序,而你提供的链接非常有帮助。如果你的程序很简单,我就不会这样做,但如果你的程序比较复杂,我会像cpluslplus.com那样检查返回值,因为你总是应该检查返回值。不这样做是不好的,因为这就像说:“我不会检查这个函数的返回值,并故意不覆盖所有可能性。”


0
C++ 我应该在删除文件之前检查它是否存在吗?
你可以这样做,但是你不应该在代码中依赖于结果。你可能会在你的代码和其他线程/应用程序之间引入竞争关系,因为它们可能会竞争相同的文件。考虑以下情况:
1. 应用程序 #1 检查 foo.txt 是否存在。结果为 true。 2. 应用程序 #2 检查 foo.txt 是否存在。结果为 true。 3. 应用程序 #1 删除 foo.txt。成功! 4. 应用程序 #2 删除 foo.txt。糟糕!
使用 remove(filename) 而忽略返回值是不好的实践吗?
不,不是的。
你只有在真正不关心结果的情况下才能忽略系统调用的返回代码,这种情况非常罕见。在删除文件时,你应该记录返回值,然后如果/当文件无法被删除(例如权限问题、已经被删除等),你可以通知用户操作失败或将其记录下来以进行调试。

0

这是一个非常难回答的问题。如果您不在意文件是否被实际删除,那么可以忽略返回值。如果不检查返回值,就无法保证文件是否已被删除。很可能它已经被删除了,但如果由于某种原因它被锁定了呢?那么您可能会遇到麻烦。正如有人指出的那样,不检查返回代码很大程度上是一种碰运气的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接