代码之家  ›  专栏  ›  技术社区  ›  Justin

Windows:如何确定自给定日期以来文件是否已被修改

  •  5
  • Justin  · 技术社区  · 15 年前

    我有一个实用程序,它可以处理一个目录中的一组文件-处理过程相对较慢(而且有很多文件),因此我尝试通过只处理“上次修改”晚于最后处理日期的文件来优化处理过程。

    1. 用户在9:00处理目录。
    2. 然后从这个目录复制一个文件并进行修改,最后修改的日期是9:30
    3. 然后在10:00再次处理该目录
    4. 然后在10:30将修改后的文件复制回目录

    由于给定文件的修改日期是9:30,并且目录最后一次处理是在10:00,因此在不应该处理的时候跳过该文件。

    如果做不到这一点,是否有其他方法可以以合理的可靠性快速确定给定的文件是否已更改?

    5 回复  |  直到 15 年前
        1
  •  4
  •   WanderingThoughts    15 年前

    你有没有想过在文件上运行MD5校验和并在以后存储它们进行比较?如果您总是处理某个目录,这可能是可行的。

        2
  •  9
  •   Matthew Manela    15 年前

    您可能想看看如何使用 FileSystemWatcher

    来自MSDN:

    // Create a new FileSystemWatcher and set its properties.
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = args[1];
    /* Watch for changes in LastAccess and LastWrite times, and
       the renaming of files or directories. */
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
       | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    // Only watch text files.
    watcher.Filter = "*.txt";
    
    // Add event handlers.
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnChanged);
    watcher.Deleted += new FileSystemEventHandler(OnChanged);
    watcher.Renamed += new RenamedEventHandler(OnRenamed);
    
        3
  •  3
  •   Yogesh    15 年前

    你可以用 FileInfo 类以获取所需的更改信息(您可能已经在使用)。您需要检查文件的两个属性,即 LastWriteTime CreationTime . 如果其中任何一个高于上次处理日期,则需要复制该文件。一个常见的误解是 总是小于 . 不是的。如果将一个文件复制到另一个文件,则新文件将保留 但是 创作时间

        4
  •  0
  •   Makach    15 年前

    你考虑过添加一个进程来监视你的目录吗?使用FileSystemWatcher?然后,您将不再使用批处理和实时系统来监视文件。

        5
  •  0
  •   snemarch    15 年前

    正如您所观察到的,将文件复制到现有目标文件会保留现有文件的CreationTime,并将LastWriteTime设置为源文件的LastWriteTime,而不是执行复制时的当前系统时间。两种可能的解决方案:

    1. 执行删除和复制,确保目标CreationTime是系统的当前时间。
    2. 检查文件的 A