/// <summary> /// Конструктор для редактирования существующего объекта синхронизации /// </summary> /// <param name="sync">Объект синхронизации</param> public FolderEditDialog(SyncObject sync) { InitializeComponent(); //загружаем вид SourcePathTextbox.Text = sync.Source.FullName; //заполняем источник DestinationPathTextbox.Text = sync.Destination.FullName; //заполняем назначение NameTextbox.Text = sync.Name; //заполняем имя syncObject = sync; //назначаем объект синхронизации для сохранения изменений }
private FileSystemWatcher Watcher; //наблюдатель за файловой системой #endregion Fields #region Constructors /// <summary> /// Создание нового смотрителя по заданным параметрам /// </summary> /// <param name="syncObject">Объект синхронизации</param> /// <param name="canLog">Вести лог-файлы</param> public WatchDog(SyncObject syncObject, bool canLog) { Folder = syncObject; //назначем объект синхронизации Watcher = new FileSystemWatcher(Folder.Source.FullName); //запускаем внутреннего смотрителя Watcher.IncludeSubdirectories = true; //включая все подпапки //сообщать об изменении - имяФайла, последняяЗапись, имяПапки Watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.DirectoryName; //привязываем обработчики сигналов Watcher.Changed += Watcher_Changed; Watcher.Created += Watcher_Created; Watcher.Deleted += Watcher_Deleted; Watcher.Renamed += Watcher_Renamed; CanLogging = canLog; //назначаем состояние ведения лог-файлов //инициализируем коллекции задач и потоков Tasks = new List<Task>(); Threads = new List<Thread>(); }
//кнопка сохранения изменений private void Apply(object sender, RoutedEventArgs e) { if (syncObject != null) { //если объект синхронизации был передан //назначаем ему все параметры syncObject.Name = NameTextbox.Text; syncObject.Source = new System.IO.DirectoryInfo(SourcePathTextbox.Text); syncObject.Destination = new System.IO.DirectoryInfo( System.IO.Path.Combine( DestinationPathTextbox.Text, NameTextbox.Text )); } else { //иначе создаем новый объект syncObject = new SyncObject( NameTextbox.Text, SourcePathTextbox.Text, DestinationPathTextbox.Text ); //и добавляем в общую коллекцию настроек config.Folders.Add(syncObject); } //возвращаем результат диалога DialogResult = true; //закрываем форму Close(); }
/// <summary> /// Метод переименования объектов /// </summary> /// <param name="fullpath">Полный путь к объекту</param> /// <param name="oldName">Старое имя</param> /// <param name="newName">Новое имя</param> /// <param name="folder">Объект синхронизации</param> void RenameObject(string fullpath, string oldName, string newName, SyncObject folder) { //получаем новый путь через замену части пути string sourcePath = fullpath.Replace( folder.Source.ToString(), //путь источника folder.Destination.ToString() //путь назначения ); //получаем новый путь с измененным именем string destPath = sourcePath.Replace(oldName, newName); try { if (Directory.Exists(sourcePath)) //если это папка Directory.Move(sourcePath, destPath); //переименовываем в новое имя else File.Move(sourcePath, destPath); //если это файл, меняем его название } catch (Exception e) { //если получаем исключение - выводим ошибку Log(string.Format("Ошибка - {0}", e.Message)); } }
/// <summary> /// Метод удаления объекта /// </summary> /// <param name="fullpath">Полный путь объекта</param> /// <param name="folder">Объект синхронизации</param> void DeleteObject(string fullpath, SyncObject folder) { //получаем новый путь через замену части пути string sourcePath = fullpath.Replace( folder.Source.ToString(), //путь источника folder.Destination.ToString() //путь назначения ); try { if (Directory.Exists(sourcePath)) //если это папка Directory.Delete(sourcePath, true); //удаляем вместе с содержимым else File.Delete(sourcePath); //иначе просто удаляем файл } catch (Exception e) { //если получаем исключение - выводим ошибку Log(string.Format("Ошибка - {0}", e.Message)); } }
void CreateObject(string fullpath, SyncObject folder) { //получаем новый путь через замену части пути string filename = fullpath.Replace( folder.Source.ToString(), //путь источника folder.Destination.ToString() //путь назначения ); try { //пока файл заблокирован системой или другим процессом while (IsFileLocked(fullpath)) Thread.Sleep(1000); //ждем его освобождения //после чего выполняем копирование с заменой File.Copy(fullpath, filename, true); } catch (Exception e) { //если получаем исключение - выводим ошибку Log(string.Format("Ошибка - {0}, ожидаем освобождения...", e.Message)); } }
void CreateFolder(string folderpath, SyncObject folder) { //получаем новый путь через замену части пути string foldername = folderpath.Replace( folder.Source.ToString(), //путь источника folder.Destination.ToString() //путь назначения ); //запускаем синхронизацию папки SyncFolder(folderpath, foldername); }
/// <summary> /// Проверка изменений для синхронизации /// </summary> /// <param name="folder">Объект синхронизации</param> void CheckSyncChanges(SyncObject folder) { //получаем информацию об "источнике" DirectoryInfo sourceDir = new DirectoryInfo(folder.Source.ToString()); //получаем информацию о "назначении" DirectoryInfo destDir = new DirectoryInfo(folder.Destination.ToString()); //получаем списки файлов в обеих директориях List<FileInfo> sourceFiles = new List<FileInfo>(sourceDir.GetFiles()); List<FileInfo> destFiles = new List<FileInfo>(destDir.GetFiles()); //проверяем наличие всех файлов "источника" в "назначении" foreach (var file in sourceFiles) { if (destFiles.Contains(file)) continue; //если уже есть, пропускаем else CreateObject(file.FullName, folder); //иначе запускаем создание объекта } //получаем список подпапок "источника" и "назначения" List<DirectoryInfo> sourceSubDirs = new List<DirectoryInfo>(sourceDir.GetDirectories()); List<DirectoryInfo> destSubDirs = new List<DirectoryInfo>(destDir.GetDirectories()); //для каждой подпапки запускаем проверку foreach (var directory in sourceSubDirs) { if (destSubDirs.Contains(directory)) continue; //если уже есть, пропуск else CreateFolder(directory.FullName, folder); //иначе запускаем создание папки со всем содержимым } }