The cast of the path looks iffy - if you compile for Unicode it won't find the path, as you're not actually pointing to the correct type of string. You should do LPTSTR lpDir = TEXT("C:\\Users\\userName\\Desktop");...

You have a number of problems that I can see immediately: According to the docs for the ReadDirectoryChangesW function, the buffer needs to be DWORD-aligned. As you are using a buffer on the stack this isn't guaranteed - you should allocate one from the heap instead. You don't seem to...

Example of monitoring multiple folders: First create some container to hold every FileSystemWatcher object: Dictionary<string,FileSystemWatcher> monitor = new Dictionary<string,FileSystemWatcher>(); Then for every folder to add, add it to the container: public void monitorFolder(string folderPath) { System.IO.Directory.CreateDirectory(draft); // no need to check if exists if (monitor.ContainsKey( folderPath )) return; //if directory...