This is rather brute force approach, but I use it for years. :)
private void FileSystemWatcherCreated(object sender,FileSystemEventArgs e)
{
while(true)
{
try
{
File.Open(e.fullPath, FileMode.Open);
break;
}
catch(IOException)
{
Thread.Sleep(500);
}
}
Extract(e.fullPath);
}