【问题标题】:Do not copy a file which has already been copied不要复制已经复制的文件
【发布时间】:2014-04-11 05:19:30
【问题描述】:

我需要监控一个源目录并复制到另一个软件监控的目标目录,然后在上传时删除文件。

我不能让这个软件监控并从源目录上传,因为它必须在上传完成后删除文件。这个问题是我组织中的一些用户在将文件保存到源目录后没有关闭文件......因为它不能被软件删除。

所以为什么我要复制到另一个目录,然后软件从目标目录上传和删除。

现在大部分情况下所有这些都有效,但是,在 robocopy 将文件复制到目标目录后,软件会上传文件然后将其删除,但随后 robocopy 会将相同文件从源目录重新复制回目标目录。

这是一个主要问题,因为我们只能上传一次文件,不能有重复。

我已经尝试过 /mov 开关,但很明显,如果文件在源目录中保持打开状态,则在成功复制后尝试从源中删除文件,然后 /mov 开关不会删除它...

我一直试图开始工作的命令是:

robocopy Source-Dir Destination-Dir *.pdf /w:20 /r:30 /mon:1 /mot:1 /log+:log.txt

在这里完全不知所措......

【问题讨论】:

    标签: batch-file cmd robocopy


    【解决方案1】:

    即使您在上传后不删除文件,如果任何其他文件都是重复的,您会怎么做?即使它具有相同的名称(也许大小相同),它仍然可以表示具有不同内容的完全不同的文件。

    显然,您将需要某种各方都遵循的文件命名约定,可用于区分文件。

    假设您有一个既定的命名约定,那么您只有两个选择。您要么依靠排队文件的用户来记住已处理的文件,要么以某种方式记录已处理的文件。听起来您想要后一种选择。

    上传文件的进程会在删除文件之前将处理后的文件名写入日志。相同的过程还可以根据日志验证每个新文件,以查看它之前是否已被处理过。如果有,则直接将其删除,无需执行任何操作。

    在我脑海中,我想到了两种快速记录已处理文件的方法。

    一种方法是简单地将每个已处理的文件名附加到已处理的.log 文本文件中:echo someFileName.ext >>"logPath\processed.log"。 FINDSTR 可用于检查给定名称是否已被处理。

    另一个选项是创建一个已处理文件夹并通过在已处理文件夹中创建一个具有该名称的空文件来记录每个已处理文件。一种方法是copy nul processed\someFileName.ext >nul。 IF EXIST 可用于查看文件是否已被处理。

    【讨论】:

      【解决方案2】:

      您可以使用此 Robocopy 开关 - 假设 Robocopy 在第一次复制文件时设置了 Archive A 属性,它应该这样做。这将排除具有 A 属性集的文件。

      /XA:A
      

      【讨论】:

        猜你喜欢
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 2015-11-06
        • 2018-08-25
        • 2019-11-10
        • 2013-08-04
        • 2012-11-12
        相关资源
        最近更新 更多