I have used fs watcher time-to-time, the biggest challenge always that the FSwatcher created event trigger when the file created (without actually final size), it means if somebody inserting in a fileshare a huge file "gigs" that will be locked until the file released by the creator app, so I can see perfect in a test environment, where limited files and data can appear. For production fswatcher combined with background worker and timer can be the solution eg FSwatcher created even should handover the task to a backgroundworker. Still i saw some cases where i need to have a hourly timer to move the remaining files, there were some weird cases when user was still using the files in couple hours. I found the perfect solution use FSwatcher along with multi threading and timer. I assume you want a windows service not a form based or web based app. For file changed event, I would not use this, if any app open a file in filestream it will execute couple of changes, but still locking the file, so you can do nothing with it, maybe you can add to list to be able to deal with it later , but as far i know in that case, if the file is edited in stream it will keep firing you the event. So my suggestion use created event set some timeout in the event to check really fast read avaiability like 5 second, if this is not happen spawn a background thread , and even the bg tread still cannot deal with the file, have a timer which keep retry on all files, which was not handled in both scenarios (like huge file and service terminated, then your background thread disposed).
Summary FSwatcher raising the event, but that not means files are accessible and ready for processing, it just monitor the filesystem and fire events you subscribed to. The events firing, but if you are not dealing with it fast enough, you may miss the next one, so use event for very fast actions, if you have lot files created, like adding them to a list, and a separate threat to do the task! If you spend too much time in an event, you might miss some, so catch the event, handover immediately the task and wait for the next one:)