//remove Except dir private void toolStripMenuItem2_Click(object sender, EventArgs e) { var selected = List_Projects.SelectedItem; if (selected == null) { return; } var selectedDir = list_dirs.SelectedItems; if (selectedDir.Count == 0) { CONSTS.AddNewLine(tblog, "Для добавления исключений" + " нужно выбрать одну из папок проекта, в котором будете указывать исключения"); return; } var selectedExc = listExceptions.SelectedItems; if (selectedExc.Count == 0) { return; } var pr = Projects.First(x => x.Name == selected.ToString()); string selExc = selectedExc[0].ToString(); if (!pr.ExceptionDirs.Contains(selExc)) { return; } pr.ExceptionDirs.Remove(selExc); listExceptions.Items.Clear(); listExceptions.Items.AddRange(pr.ExceptionDirs.ToArray()); // SaveAllProjects(); }
//TODO Menu/edit dirs /// <summary> /// Run Sync projects with attribute AutoSync=True /// </summary> public void StartAutoSync() { Thread autoSyncThread = new Thread(delegate() { var projAuto = Projects.Where(x => x.AutoSync); //All autosync projects if (projAuto.Count() == 0) { CONSTS.AddNewLine(tblog, "Nothing for autosync"); return; } CONSTS.AddNewLine(tblog, "For AutoSync " + projAuto.Count() + " projects"); foreach (var project in projAuto) { if (SyncThread != null) { while (IsRunningSync || SyncThread.IsAlive) { Thread.Sleep(1000); } } StartSync(project, true); } }); autoSyncThread.Start(); }
//Add Except Dir private void toolStripMenuItem1_Click(object sender, EventArgs e) { var selected = List_Projects.SelectedItem;//selected project in List if (selected == null) { return; } var selectedDir = list_dirs.SelectedItems; //Selected directory into project if (selectedDir.Count == 0) { CONSTS.AddNewLine(tblog, "Для добавления исключений" + " нужно выбрать одну из папок проекта, в котором будете указывать исключения"); return; } var selectedExc = listExceptions.SelectedItems; Input input = new Input(); if (selectedExc.Count == 1) { input.TEXT = selectedExc[0].ToString(); } var dg = input.ShowDialog(); if (dg != DialogResult.OK) { return; } if (string.IsNullOrWhiteSpace(input.TEXT) || listExceptions.Items.Contains(input.TEXT)) { return; } var pr = Projects.First(x => x.Name == selected.ToString()); //selected proj string relpath = input.TEXT.TrimEnd('\\').Contains(":\\") ? GetRelationPath(input.TEXT.TrimEnd('\\'), selectedDir[0].Text) : input.TEXT.TrimEnd('\\'); if (pr.ExceptionDirs.Contains(relpath)) { return; } pr.ExceptionDirs.Add(relpath);//добавление относительного пути listExceptions.Items.Clear(); listExceptions.Items.AddRange(pr.ExceptionDirs.ToArray()); //SaveAllProjects(); }
/// <summary> /// Копировать выделенную папку в другие без проверки /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void копироватьЭтуПапкуВОстальныеToolStripMenuItem_Click(object sender, EventArgs e) { try { var selected = List_Projects.SelectedItem; if (selected == null) { return; } var selectedDir = list_dirs.SelectedItems; if (selectedDir.Count == 0) { return; } string SelectedDirPATH = selectedDir[0].Text; if (DriveLette == SelectedDirPATH.Split('\\')[0])//FlashDrive { SelectedDirPATH = GetRelationPath(SelectedDirPATH, DriveLette); } var Project = Projects.First(x => x.Name == selected.ToString()); CopyDIRSThread = new Thread(delegate() { CONSTS.invokeProgress(progressBar1, 0); CONSTS.DisableButton(button1); // кнопку старт в активный режим CONSTS.AddNewLine(tblog, "Проект " + Project.Name + ". Принудительное копирование " + SelectedDirPATH); foreach (Projdir onlineDir in Project.OnlineDirs) { if (onlineDir.Dir == SelectedDirPATH) { continue; } //copy selected Dir into others DirectoryCopy(SelectedDirPATH, onlineDir.Dir, true); CONSTS.AddNewLine(tblog, SelectedDirPATH + " } ---> {" + onlineDir.Dir); } CONSTS.AddNewLine(tblog, $"\t\tГотово. Выбранная папка скопирована в {(Project.OnlineDirs.Count() - 1)} другие папки.");; CONSTS.EnableButton(button1); // кнопку старт в обычный режим }); CopyDIRSThread.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message, "ForceCopy"); CONSTS.AddNewLine(tblog, "\t\tПроцесс копирования прерван."); } }
public Form1() { //TODO SYNC SOME PROJECTS InitializeComponent(); log = new LogForm(); tmr = new MyTimer(log); cfg = new configmanager(cfg_file); Projects = cfg.ReadAllProjects() ?? new List <Project>(); foreach (var p in Projects) { List_Projects.Items.Add(p.ToString()); } DriveLette = CONSTS.DriveLetter; button1.Text = CONSTS.btSyncText1; this.FormClosing += Form1_FormClosing; List_Projects.SelectedIndexChanged += List_Projects_SelectedIndexChanged; list_dirs.SelectedIndexChanged += List_dirs_SelectedIndexChanged; list_dirs.DoubleClick += List_dirs_DoubleClick; checkBox1.CheckedChanged += CheckBox1_CheckedChanged; CONSTS.AddNewLine(tblog, "USB-Flash: " + DriveLette); }
private void btSelectUSB_Click(object sender, EventArgs e) { FolderBrowserDialog fd = new FolderBrowserDialog(); fd.Description = "Выберите любую папку на USB/Select any folder on USB."; var dr = fd.ShowDialog(); if (dr != DialogResult.OK) { return; } if (!Directory.Exists(fd.SelectedPath)) { return; } string newLette = fd.SelectedPath.Split('\\').First(); DriveLette = newLette; CONSTS.AddNewLine(tblog, "New USB letter: " + DriveLette); }
private void button1_Click_1(object sender, EventArgs e) { if (button1.Text == CONSTS.btSyncText2) { // tmr.Start("Aborting process"); if (SyncThread != null && SyncThread.IsAlive) { SyncThread.Abort(); } if (CopyDIRSThread != null && CopyDIRSThread.IsAlive) { CopyDIRSThread.Abort(); } CONSTS.EnableButton(button1); CONSTS.AddNewLine(tblog, "Прервано пользователем"); // tmr.Stop(); return; } log.ClearLog(); SyncSelectedProjects(); }
/// <summary> /// Sync All online directories of project /// </summary> /// <param name="project"></param> /// /// <param name="silentMode">true - without dialog boxes</param> private void StartSync(Project project, bool silentMode = false) { // if (List_Projects.SelectedItem == null) return; CONSTS.DisableButton(button1); // var selectedProj = Projects.First(x => x.Name == List_Projects.SelectedItem.ToString()); SyncThread = new Thread(delegate() { try { SetSyncStatus(true); int newfiles = 0; int updatedfiles = 0; int errorCopy = 0; var OnlineDirs = project.OnlineDirs.Where(x => x.PC_Name == pc_name || x.PC_Name == CONSTS.FlashDrive); //.AllProjectDirs.Where(x => x.IsOnline); if (OnlineDirs.Count() == 0) { SetSyncStatus(false); return; } if (OnlineDirs.Count() == 1) { foreach (var t in OnlineDirs.First().Info2()) { tmr.Start("Вывод инфо директории"); CONSTS.AddNewLine(tblog, t); tmr.Stop(); } SetSyncStatus(false); return; } if (OnlineDirs.Count() > 1) //run SYNC { //DateTime t = DateTime.Now; int filesCount = 0; //count of files in dir int cTotal = 0; List <Queue> queue = new List <Queue>(); //очередь файлов источника и назначений Queue.Count = 0; //перебор всех Онлайн директорий List <string> skippedFiles = new List <string>(); //relativ path!!! foreach (var dir in OnlineDirs) { dir.ReadFiles(); } foreach (var Dir in OnlineDirs) //перебор все папок проекта { //каждый файл ищется в других папках проекта и добавляется в очередь foreach (var dateFile in Dir.AllFiles()) { //получаем относительный путь файла string relatePath = GetRelationPath(dateFile.Key, Dir.Dir); //проверялся ли такой файл раньше? if (skippedFiles.Contains(relatePath)) { continue; // ДА - пропускаем } //проверяем, нет ли такого файла уже в очереди //поиск файла в очереди if (queue.Any(x => x.SourceFile.EndsWith(relatePath))) { continue; //dataFile.Key - Full filePath } var newest = dateFile; //самый свежий файл string SrcDir = Dir.Dir; //создаем список файлов, которые нужно заменить файлом dateFile, файл назначения // Dictionary<string, DateTime> otherFiles = new Dictionary<string, DateTime>(); List <Tuple <string, string, DateTime, bool> > otherFiles = new List <Tuple <string, string, DateTime, bool> >(); //item1 = Fullpath, //item2 = Dir, //item3 = DateTime lastWrite, //item4 = IsNewfile foreach (var otherDir in OnlineDirs) //Поиск текущего файла dateFile в остальных директориях { if (otherDir == Dir) { continue; //пропуск текущей директории } var file = otherDir.FindFile(relatePath); //поиск такого же файла //если такого файла в Директории нет if (String.IsNullOrEmpty(file.Key)) //создадим путь для копирования в эту директорию { //пара значений (Путь файла, Время последнего изменения) file = new KeyValuePair <string, DateTime> (newest.Key.Replace(Dir.Dir, otherDir.Dir), newest.Value); otherFiles.Add(new Tuple <string, string, DateTime, bool>(file.Key, otherDir.Dir, file.Value, true)); //добавление в список назначения continue; } if (newest.Value > file.Value) { otherFiles.Add(new Tuple <string, string, DateTime, bool>(file.Key, otherDir.Dir, file.Value, false)); //добавление файла в список файлов } else if (newest.Value == file.Value) { continue; //SKIP SAME FILES, DONT COPY!!! } else //меняем переменную новейшего файла с текущим { if (!otherFiles.Any(x => x.Item1 == newest.Key)) { otherFiles.Add(new Tuple <string, string, DateTime, bool>(newest.Key, Dir.Dir, newest.Value, false)); } { newest = file; SrcDir = otherDir.Dir; } } } // tmr.Stop(1); //нашли самый новый файл dateFile среди остальных директорий //теперь добавляем в очередь if (otherFiles.Count() != 0) { foreach (var otherfile in otherFiles) { //Добавление для каждого файла назначения своей очереди queue.Add(new Queue(true, //Active status newest.Key, //Full Source filepath otherfile.Item1, //full Targer filepath SrcDir, //Directory of source file otherfile.Item2, //directory of target file newest.Value, //last modification datetime Source File otherfile.Item3, //last modification datetime Target File otherfile.Item4)); //is new file? or overwrited } } else { skippedFiles.Add(GetRelationPath(newest.Key, Dir.Dir)); //если все файлы одинаковые как newest - пропускаем } } } //проверили все файлы и добавили их в очередь //проверяем есть ли что копировать if (queue.Count == 0) { if (!silentMode) { MessageBox.Show("Все папки одинаковые, нечего синхронизировать"); } CONSTS.AddNewLine(tblog, project.Name + ": Нечего синхронизировать."); SetSyncStatus(false); return; } if (!silentMode) // not silent { var msgBox = new MsgDialog(queue); var dr = msgBox.ShowDialog(); if (dr != DialogResult.OK) { SetSyncStatus(false); return; } else { queue = msgBox.ReturnedQueue; } } CONSTS.AddNewLine(tblog, "--------------------------------------------"); cTotal = queue.Count(); //count of SrcFiles filesCount = 0; //total copied DestFiles int nUpd = 0; //count of updated files int nNew = 0; //count of new files foreach (var File in queue) //перебор файлов, которые надо копировать { { string SrcFile = File.SourceFile; string DstFile = File.TargetFile; string DstProjDir; string SrcProjDir = File.SourceFileProjectDir; //Папка проекта-источник // if (!Directory.Exists(SrcFile)) Directory.CreateDirectory(SrcFile); //var AllDestFiles = File.Value; //список куда копировать // int cAllSource = AllDestFiles.Count; //cTotal += AllDestFiles.Count; //================COPY======== int ID = 1000; //процесс копирования { tmr.Start(DstFile, ID); filesCount++; if (System.IO.File.Exists(DstFile)) //File exist { try { //update file var size = new FileInfo(SrcFile).Length; CONSTS.AddNewLine(tblog, filesCount.ToString() + "). " + "Updated :> " + SrcFile + "\t(" + ((double)size / 1000) + "kbit)"); CONSTS.AddToTempLine(tblog, " Copy :> " + SrcFile + " ==>" + DstFile); System.IO.File.Copy(SrcFile, DstFile, true); CONSTS.AddNewLine(tblog, " Updated :> " + DstFile); nUpd++; } catch (Exception ex) { errorCopy++; CONSTS.AddNewLine(tblog, "err:>\t" + ex.Message); } } else //copy new file { string Fullfiledir = SrcFile.Remove(SrcFile.Length - SrcFile.Split('\\').Last().Length); //полный путь файла-источника var targetProjDir = project.AllProjectDirs.FirstOrDefault(x => DstFile.Contains(x.Dir)).Dir; //директория проекта файла-источника string relativefiledir = GetRelationPath(Fullfiledir, SrcProjDir); //вложенная папка(папки) внутри директории проекта string targetDir = targetProjDir + relativefiledir; //Полный путь папки-назначения if (!Directory.Exists(targetDir)) { Directory.CreateDirectory(targetDir); } try { var size = new FileInfo(SrcFile).Length; CONSTS.AddNewLine(tblog, filesCount.ToString() + "). " + "New :> " + SrcFile + "\t(" + ((double)size / 1000) + "kbit)"); CONSTS.AddToTempLine(tblog, " Copy :> " + SrcFile + " ==>" + DstFile); System.IO.File.Copy(SrcFile, DstFile, true); CONSTS.AddNewLine(tblog, " Copied :> " + DstFile); nNew++; } catch (Exception ex) { errorCopy++; CONSTS.AddNewLine(tblog, "err:>\t" + DstFile + "\t" + ex.Message); } } //end IF Else CONSTS.invokeProgress(progressBar1, (int)(filesCount * 100 / cTotal)); tmr.Stop(ID); ID++; } //конец перебора файлов назначения } //конец перебора исходных файлов CONSTS.AddNewLine(tblog, "--------------------------------"); CONSTS.AddNewLine(tblog, project.Name + " синхронизирован."); CONSTS.AddNewLine(tblog, "Новых файлов(new files): \t\t" + nNew.ToString()); CONSTS.AddNewLine(tblog, "Обновлено файлов(updated files): \t" + nUpd.ToString()); CONSTS.AddNewLine(tblog, "Всего исходных файлов(total source):\t" + cTotal.ToString()); CONSTS.AddNewLine(tblog, "Всего скопировано(copied): \t" + cTotal.ToString()); CONSTS.AddNewLine(tblog, "Ошибок копирования(errors):\t" + errorCopy.ToString()); CONSTS.EnableButton(button1); // Projects = cfg.ReadAllProjects(); } } finally { CONSTS.EnableButton(button1); SetSyncStatus(false); } } ); SyncThread.Start(); }
public void AddLine(string text) { CONSTS.invokeTBAppendText(textBox1, text); //textBox1.AppendText(text + "\r\n"); }
public void ClearLog() { CONSTS.invokeTBClearText(textBox1);// textBox1.Clear(); }