5

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

通常这很好用,但是我发现复制文件不会更改上次修改日期,因此有多种情况涉及复制文件,其中某些已更改的文件会被进程跳过,例如:

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

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

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

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

4

5 回答 5

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);
于 2010-09-30T06:33:13.063 回答
4

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

于 2010-09-30T06:31:22.420 回答
3

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

于 2010-09-30T06:54:22.843 回答
0

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

于 2010-09-30T06:38:01.113 回答
0

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

  1. 执行删除和复制,确保目标 CreationTime 将是系统的当前时间。
  2. 还要检查文件的存档属性,并在处理时将其清除。复制 source->dest 时,会设置 dest +A 属性。
于 2010-09-30T08:10:09.950 回答