예제 #1
0
 /// <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; //назначаем объект синхронизации для сохранения изменений
 }
예제 #2
0
        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>();
        }
예제 #3
0
 //кнопка сохранения изменений
 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();
 }
예제 #4
0
        /// <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));
            }
        }
예제 #5
0
        /// <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));
            }
        }
예제 #6
0
        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));
            }
        }
예제 #7
0
        void CreateFolder(string folderpath, SyncObject folder)
        {
            //получаем новый путь через замену части пути
            string foldername = folderpath.Replace(
                    folder.Source.ToString(), //путь источника
                    folder.Destination.ToString() //путь назначения
                    );

            //запускаем синхронизацию папки
            SyncFolder(folderpath, foldername);
        }
예제 #8
0
        /// <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); //иначе запускаем создание папки со всем содержимым
            }
        }