【问题标题】:Copy only newer files with File.Copy?使用 File.Copy 仅复制较新的文件?
【发布时间】:2012-10-22 04:57:12
【问题描述】:

我对@9​​87654321@ 有点困惑。最初,我删除了整个目录结构,然后从源路径复制到目标路径,但这需要一段时间。现在我正在做的只是在目标路径上创建目录结构,如果它不存在的话。如果存在,我只想复制较新的文件。删除删除后,复制速度非常快,但我不确定它是否真的在复制较新的文件。如果我做File.Copy(source,target),这是否只复制不存在的文件?如果我做File.Copy(source,target,true),这是否会复制文件,无论它是否更新?

【问题讨论】:

    标签: c# .net-4.0


    【解决方案1】:

    File.Copy(source,target,true) 将覆盖文件 - 无论它是否较新。

    Copy 没有逻辑来确定文件的新鲜度或正确的操作。

    你需要自己实现这个逻辑——如果你只想复制较新的文件,你需要比较两个文件的创建日期并且只复制较新的。

    【讨论】:

    • 如果是这样的话,是不是删除导致它花费了这么长时间,如果它无论如何都复制它,为什么它走得这么快,它实际上只需要不到 1 秒就可以接管30 秒。
    • 比较源上的创建日期和目标上的创建日期?
    • @Xaisoft - 时间长短可能有多种原因。我不会推测。是的,源和目标的创建日期。
    • 源在一台服务器上而目标是您的本地计算机是否重要?这会导致创建时间中断吗?
    • @Xaisoft - 如果不同系统上的时钟不同步,它可能会。检查双方的UTC应该有帮助,但您需要对此进行测试。
    【解决方案2】:

    您应该使用FileInfo Class 并比较逻辑中的文件。

    【讨论】:

      【解决方案3】:

      如果我执行 File.Copy(source,target),这是否只复制不存在的文件?

      File.Copy(source, target) 如果目标文件已经存在(不管它是否更新),将抛出一个IOException

      如果您的代码使用它“运行得很快”,我假设您在某个地方“吞下了异常”(即有一个 try 和一个空的 catch 块)。那是邪恶的,因为它让你的程序“看起来”就像它在正常工作时一样正常工作。不要那样做!它使调试成为一场噩梦。

      如果我执行 File.Copy(source,target,true),无论文件是否较新,这是否都会复制文件?

      是的。

      如果您希望根据某些属性复制文件,您可以使用FileFileInfo class (What's the difference?) 来获得这个信息。您可以在“创建时间”、“上次访问时间”和“上次写入时间”之间进行选择(取决于您如何定义“较新”)。

      【讨论】:

      • 我没有吞下异常,因为我在尝试复制之前检查了文件是否存在,但我想我需要添加到这个逻辑来测试其中一个属性(CreateTime、LastAccessTime 等)
      • 所以我猜它没有复制任何东西,哈哈。我已经实现了 File.Copy,我可以只使用 FileInfo 来获取创建时间,但仍然使用 File.Copy
      • 当然。您只需要使用File.Copy(_, _, true) 变体来确保文件确实被覆盖。
      • 有一个File.GetCreationTimeFile.GetCreationTimeUTC。与 FileInfo 中的相比,这有什么问题?
      • @Xaisoft:没什么,两者都很好。请参阅stackoverflow.com/q/1324788/87698 进行比较。感谢您提出这一点,我已将其添加到我的答案中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2021-09-19
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多