Windows: How to determine if a file has been modified since a given date

Justin picture Justin · Sep 30, 2010 · Viewed 16.6k times · Source

I have a utility which goes through a processes a set of files in a directory - the process is relatively slow (and there are a lot of files) and so I've tried to optimise the process by only processes files that have a "last modified" later than the last processing date.

Usually this works well however I've found that as copying a file doesn't change the last modified date, and so there are various scenarios involving copying files in which certain files that have changed are skipped by the process, for example:

  1. The user processes the directory at 9:00.
  2. A file is then copied from this directory and modified so that it has a last modified date of 9:30
  3. The directory is then processed again at 10:00
  4. The modified file is then copied back into the directory at 10:30
  5. Finally the directory is processed again at 11:00

As the modified date of the given file is 9:30, and the directory was last processed at 10:00 the file is skipped when it shouldn't be.

Unfortunately the above tends to happen far too often in certain situations (such as in a collaborative environment with source control etc...). Clearly my logic is flawed - what I really need is a "last modified or copied" date. does such a thing exist?

Failing that, is there another way to quickly determine with reasonable reliability if a given file has changed?

Answer

Matthew Manela picture Matthew Manela · Sep 30, 2010

You might want to look at using the FileSystemWatcher class. This class lets you monitor a directory for changes and will fire an event when something is modified. Your code can then handle the event and process the file.

From 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);