+1  A: 

Usually the copying program is doing it in blocks, not entire file at once. I don't think you can do anything to avoid this, you will have to adopt your algorithms to deal with this.

You can perform an attempt to open file with exclusive read rights, which should be granted to your program only when other program finished copying and closed file. Otherwise you will get IOException and you can wait for next change. But this doesn't mean you shouldn't deal with multiply change events. Opening text file in Notepad and saving it once in a while will generate change events, but file will not be locked all the time.

Another approach would be to collect touched files for a period of time, and when FileSystemWatcher stops generating events, process all files at once.

Ilya Ryzhenkov
+10  A: 

According to the documentation (see the first bullet point under Events and Buffer Sizes):

Common file system operations might raise more than one event. For example, when a file is moved from one directory to another, several OnChanged and some OnCreated and OnDeleted events might be raised. Moving a file is a complex operation that consists of multiple simple operations, therefore raising multiple events. Likewise, some applications (for example, antivirus software) might cause additional file system events that are detected by FileSystemWatcher.

Alex Lyman
@Alex Lyman: +1, also you could mention using Process Monitor to see exactly what the two change operations are.
sixlettervariables