Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 547
Justin Avatar asked Sep 30 '10 06:09

Justin


2 Answers

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);
like image 198
Matthew Manela Avatar answered Nov 15 '22 00:11

Matthew Manela


Have you thought of running MD5 checksums on the files and storing them later for comparison? If your always processing a certain directory, this might be feasible.

like image 36
WanderingThoughts Avatar answered Nov 15 '22 00:11

WanderingThoughts