FileSystemWatcher не может узнать, было ли копирование выполнено как одна операция, потому что нет такой вещи, как копирование нескольких файлов одновременно. Проводник Windows выглядит так, используя перетаскивание, но по сути это несколько копий.
Если вы хотите, вы можете написать простую оболочку для FileSystemWatcher, которая будет принимать все события Create и, если они произойдут, скажем, с интервалом 200 мс, вызвать событие «Multiple Created».
Вот рабочий код для мониторинга создания событий. Вы можете основывать свою оболочку на этом, чтобы отслеживать другие события, если вам нужно, и / или предоставлять другие свойства.
public class MyWatcher
{
private FileSystemWatcher watcher = new FileSystemWatcher();
private System.Timers.Timer timer;
private object listSync = new object();
private List<FileSystemEventArgs> events = new List<FileSystemEventArgs>();
public delegate void FileSystemMultipleEventHandler(object sender, FileSystemEventArgs[] events);
public FileSystemMultipleEventHandler OnMultipleFilesCreated { get; set; }
public MyWatcher(string path, NotifyFilters notifyFilters, string filter)
{
this.watcher.Path = path;
this.watcher.Created += FileCreated;
watcher.Filter = filter;
watcher.EnableRaisingEvents = true;
}
private void FileCreated(object sender, FileSystemEventArgs e)
{
if (this.timer != null)
{
this.timer.Stop();
lock (this.listSync) this.events.Add(e);
this.timer.Start();
}
else
{
lock (this.listSync) this.events.Add(e);
this.timer = new Timer(200);
this.timer.Elapsed += MultipleFilesCreated;
this.timer.Start();
}
}
private void MultipleFilesCreated(object stat, ElapsedEventArgs args)
{
if (OnMultipleFilesCreated != null)
{
FileSystemEventArgs[] result;
lock (this.listSync)
{
// make a copy
result = events.ToArray();
this.events = new List<FileSystemEventArgs>();
}
OnMultipleFilesCreated(this, result);
}
this.timer.Stop();
}
}
Я использую блокировку здесь, чтобы сделать доступ к списку событий потокобезопасным (таймер против события FileCreated). Не используется никакая одновременная коллекция, потому что у них нет ClearAll (), и мне нужно будет блокировать и удалять элементы по одному или в любом случае заново создавать коллекцию с блокировкой.