/// <summary> /// Создает экземпляры <see cref="FileSystemWatcher"/> для указаных папок /// </summary> /// <param name="folderPaths">Список путей к папкам для прослушивания</param> /// <param name="handlers">Список обработчиков</param> private void CreateWatchers(ListenedFolderPathElementCollection folderPaths, List <FileSystemEventHandler> handlers) { if (folderPaths != null) { foreach (ListenedFolderPathElement folderPath in folderPaths) { try { FileSystemWatcher watcher = new FileSystemWatcher(folderPath.FolderPath); watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; //определяем обработчики события создания файла if (handlers != null) { foreach (var item in handlers) { watcher.Created += item; } } watcher.EnableRaisingEvents = true; watchers.Add(watcher); } catch (ArgumentException e) { loger.PrintError(e.Message); } } } }
//метод перемещает указанный файл в назначенное место private void MoveTo(string sourceFilePath, string newFilePath) { //максимальное количество попыток обращения к файлу const int maxNumberFailure = 50; //флаг для определения свободен ли файл от других процессов bool fileLocked = true; //счетчик неудачных попыток получить доступ к файлу int failureСounter = 0; //пока файл занят while (fileLocked) { try { //если файл уже существует в назначенной папке, то удаляем его if (File.Exists(newFilePath)) { File.Delete(newFilePath); } //если файл который необходимо переместить существует if (File.Exists(sourceFilePath)) { File.Move(sourceFilePath, newFilePath); //получаем имя файла и записываем в журнал, что файл был перемещен string fileName = Path.GetFileNameWithoutExtension(sourceFilePath); loger.PrintFileMoved(fileName, newFilePath); } fileLocked = false; } catch (IOException ex) { failureСounter++; if (failureСounter == maxNumberFailure) { loger.PrintError(ex.Message); fileLocked = false; } } } }