【问题标题】:FileInfo.CopyTo how to detect overwriteFileInfo.CopyTo 如何检测覆盖
【发布时间】:2021-10-11 17:42:52
【问题描述】:
file.CopyTo(destinationFullName , true);

if (destinationFullName == file.FullName) {
      logTrace(TraceEventType.Information, "Overwritten file " + file.FullName + " with " + destinationFullName);
 }

有没有一种好方法可以检测文件是否被覆盖,而不是手动比较源文件名和目标文件名。如果 CopyTo 覆盖文件,我想记录一条消息。

【问题讨论】:

  • 提示: FileInfo.Exists。在.CopyTo之前。
  • 但要意识到其中潜伏着一个竞争条件(几乎是一个不可避免的竞争条件)。
  • 不,FileInfo.Exists 不够好。
  • 如果您不想在复制之前使用 FileExists,则没有 WinAPI(在 Windows 的情况下)来复制文件并获取指示文件是新创建的还是被覆盖的值,我所知。因此,您需要使用例如流创建您自己的方法,例如:FileCopyResult CopyFile(string source, string target, bool overwrite); 其中FileCopyResult 可以是{Created, Overwritted},您将引发任何标准异常。 Sample 1Sample 2

标签: c#


【解决方案1】:

如果您不想在尝试复制之前检查文件是否存在,您可以使用File.Copy() 方法,它在the documentation 中表示不允许覆盖文件:

将现有文件复制到新文件。不允许覆盖同名文件。

...

IOException
destFileName 存在。

因此您可以尝试复制副本,然后捕获表明该文件已存在的IOException。有关详细信息,请参阅我粘贴的链接。

我相信您有充分的理由不想提前检查文件是否存在。我通常不建议使用这样的 try catch 块。

【讨论】:

  • fwiw,File.Exists()kind of bad,这是正确的做法 :)
  • 我明白你的意思。文件系统可能很棘手且不可预测,尤其是在有多个用户的网络上。
  • 我确实想覆盖该文件,但如果发生这种情况我只想记下。所以你是说如果异常触发就再次复制?
  • 你可以从 catch 块中做到这一点。如果您的代码进入了带有 destFileName 存在异常的 catch 块,您可以记录它然后覆盖该文件。
猜你喜欢
  • 2019-08-15
  • 1970-01-01
  • 2014-05-17
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多