As for writing a file with a list of files to be added as a first step, your application will pick it up, read it, and then wait for the files to be written. When the final file is written, you can pack them and send them. Thus, if several "transactions" are triggered, you do not have "target files" advancing on each other. Give the indicator file a well-known template name, which is unlikely to happen in regular files, and will provide some means so that several indicator files can appear at the same time.
If I were to implement something like this, I would probably use some kind of file name, for example ~<ANOTHER-UNIQUE-GUID>.tmp , my file system observer will keep track of a single file name of this format, which in turn tells the observer of another file system to wait on the files listed inside. When the files have been deleted, the temporary file can be deleted.
This approach can be easily cut so that each of your observers does not step over each other and does not transfer / delete files that other observers are working on.
As suggested earlier, it may be more efficient to write files to a single archive and use them by unpacking them at the destination.
Benalabaster
source share