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

时间:2010-09-30 06:25:11

标签: c# last-modified

我有一个实用程序,它在一个目录中处理一组文件 - 该过程相对较慢(并且有很多文件)所以我试图通过只有进程文件来优化进程比上次处理日期晚的“最后修改”。

通常情况下这很有效但我发现复制文件不会改变上次修改日期,因此有各种方案涉及复制文件,其中某些文件已被更改过程,例如:

  1. 用户在9:00处理目录。
  2. 然后从该目录复制文件并进行修改,使其最后修改日期为9:30
  3. 然后在10:00
  4. 再次处理该目录
  5. 然后将修改后的文件复制回10:30
  6. 目录
  7. 最后在11:00再次处理该目录
  8. 由于给定文件的修改日期是9:30,并且目录最后一次处理在10:00,因此不应该跳过该文件。

    不幸的是,在某些情况下(例如在具有源控制等的协作环境中),上述情况往往会发生得太频繁。显然我的逻辑是有缺陷的 - 我真正需要的是“最后修改或复制”的日期。这样的事情存在吗?

    如果失败了,是否有另一种方法可以在给定文件发生变化的情况下以合理的可靠性快速确定?

5 个答案:

答案 0 :(得分:9)

您可能希望查看使用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);

答案 1 :(得分:4)

您是否考虑过对文件运行MD5校验和并稍后存储以进行比较?如果您总是处理某个目录,这可能是可行的。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

您是否考虑过添加流程来查看目录?使用FileSystemWatcher?然后,您将使用批处理和实时系统来监控文件。

答案 4 :(得分:0)

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

  1. 执行删除并复制,确保目标CreationTime是系统的当前时间。
  2. 检查文件的 A rchived属性,并在处理时清除它。复制source-> dest时,将设置dest + A属性。