// Обработчик события нажатия кнопки Запуск по требованию private void ForceRunButton_Click(object sender, EventArgs e) { AppHelper.CreateMessage("Выполнен запуск по требованию", MessageType.Information); TasksHelper.RunTasksThread(); }
/// <summary> /// Выполняет задачи /// </summary> public static void RunTasks() { if (AppHelper.IsRunning) { return; } GUIController.LoadingState = true; AppHelper.IsRunning = true; try { // Исчем и выполняем имеющиеся SQL файлы SQLHelper.ExecuteSqlScripts(); } catch (Exception ex) { // При ошибке продолжаем работу метода AppHelper.CreateMessage("Ошибка во время выполнения SQL скрипта: " + ex.ToString(), MessageType.Error, false, true, true); } try { // Выполняем перебор задач foreach (Task task in AppHelper.Configuration.Tasks) { bool isDirectory = false; // Если папка или файл назначения не существует, то выбросится исключение, и итерация цикла будет пропущена try { isDirectory = IOHelper.IsPathDirectory(task.Source); } catch { continue; } StringBuilder log = new StringBuilder(); // Регулярное выражение, в соответствии с которым будет выполнена обработка файлов if (string.IsNullOrWhiteSpace(task.Regex)) { task.Regex = ".*"; } Regex regEx = new Regex(task.Regex); // Выполнять обработку файлов в папке рекурсивно, если задано SearchOption sOpt = (task.Recursive) ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; // Обработка папки/папок if (isDirectory) { foreach (string file in Directory.GetFiles(task.Source, "*", sOpt)) { string filename = Path.GetFileName(file); // Выбираем файлы имя которых строго соответствует регулярному выражению if (regEx.IsMatch(filename)) { // Создаем временную папку для копирования/перемещения файлов если она не существует string newDir = Path.Combine(AppHelper.TempTasksPath, task.Name); if (!Directory.Exists(newDir)) { Directory.CreateDirectory(newDir); } // Путь файла для копируемого/перемещаемого файла string newPath = Path.Combine(newDir, filename); try { // Интервал в днях, за который будет выполнена обработка файлов if (task.DayInterval > 0) { DateTime date = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0); date = date.AddDays(task.DayInterval.ToNegative()); FileInfo info = new FileInfo(file); if (info.LastWriteTime < date) { continue; } } // Разрешить повторную отправку файлов, если задано if (!task.AllowDuplicate) { // Проверяем файл на факт отправки ранее bool fileExists = SQLHelper.CheckForDuplicate(task.Name, file); if (fileExists) { continue; } // Добавляем файл в список обработанных SQLHelper.CreateFileFingerprint(task.Name, file); } // Внешняя библиотека для дополнительных условий обработки файлов try { if (!string.IsNullOrWhiteSpace(task.ExternalLib) && task.ExternalLibAsm != null) { Type type = task.ExternalLibAsm.GetType("Tasks.FileCondition"); IFileCondition condition = (IFileCondition)Activator.CreateInstance(type); if (task.ExternalLibParams.ContainsKey("filename")) { task.ExternalLibParams.Remove("filename"); } task.ExternalLibParams.Add("filename", file); if (!condition.Check(task.ExternalLibParams)) { string error = "Неизвестная ошибка"; if (condition.HasError) { error = condition.ErrorString; } log.AppendLine("Ошибка при проверке файла '" + file + "':\r\n" + error); continue; } } } catch (Exception ex) { log.AppendLine("Ошибка: " + ex.ToString()); continue; } // Удаление файла во временной папке, если он существует if (File.Exists(newPath)) { File.Delete(newPath); } // Перемещать файл из исходного расположения если задано if (task.MoveFile) { File.Move(file, newPath); } else { File.Copy(file, newPath); } } catch (Exception ex) { // При ошибке переходим к следующему файлу. Не обработанный файл остается в старом расположении log.AppendLine("Ошибка при перемещении файла '" + file + "' -> '" + newPath + "'.\r\n" + ex.ToString()); } } } } else // Обработка файла { string filename = Path.GetFileName(task.Source); // Проверяем соответствие имени файла регулярному выражению if (regEx.IsMatch(filename)) { // Создаем временную папку для копирования/перемещения файлов если она не существует string newDir = Path.Combine(AppHelper.TempTasksPath, task.Name); if (!Directory.Exists(newDir)) { Directory.CreateDirectory(newDir); } // Путь файла для копируемого/перемещаемого файла string newPath = Path.Combine(newDir, filename); try { // Интервал в днях, за который будет выполнена обработка файлов if (task.DayInterval > 0) { DateTime date = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0); date = date.AddDays(task.DayInterval.ToNegative()); FileInfo info = new FileInfo(task.Source); if (info.LastWriteTime < date) { continue; } } // Разрешить повторную отправку файлов, если задано if (!task.AllowDuplicate) { bool fileExists = SQLHelper.CheckForDuplicate(task.Name, task.Source); if (fileExists) { continue; } SQLHelper.CreateFileFingerprint(task.Name, task.Source); } // Внешняя библиотека для дополнительных условий обработки файлов try { if (!string.IsNullOrWhiteSpace(task.ExternalLib) && task.ExternalLibAsm != null) { Type type = task.ExternalLibAsm.GetType("Tasks.FileCondition"); IFileCondition condition = (IFileCondition)Activator.CreateInstance(type); if (task.ExternalLibParams.ContainsKey("filename")) { task.ExternalLibParams.Remove("filename"); } task.ExternalLibParams.Add("filename", task.Source); if (!condition.Check(task.ExternalLibParams)) { string error = "Неизвестная ошибка"; if (condition.HasError) { error = condition.ErrorString; } AppHelper.CreateMessage("Ошибка при проверке файла '" + task.Source + "':\r\n" + error, MessageType.Error, false, true, true); continue; } } } catch (Exception ex) { AppHelper.CreateMessage("Ошибка: " + ex.ToString(), MessageType.Error, false, true, true); continue; } // Удаление файла во временной папке, если он существует if (File.Exists(newPath)) { File.Delete(newPath); } // Перемещать файл из исходного расположения если задано if (task.MoveFile) { File.Move(task.Source, newPath); } else { File.Copy(task.Source, newPath, true); } } catch (Exception ex) { AppHelper.CreateMessage("Ошибка при перемещении файла '" + task.Source + "' -> '" + newPath + "'.\r\n" + ex.ToString(), MessageType.Error, false, true, true); continue; } } } if (log.Length > 0) { AppHelper.CreateMessage(log.ToString(), MessageType.Error, false, true, true); } } Exception uploadEx; FileOperationInfo[] fInfos; // Проверяем наличие неотправленных архивов во временной папке и отправляем их try { List <string> zipArchives = FtpHelper.GetSkippedZipFiles(AppHelper.TempFtpPath); if (zipArchives.Count > 0) { foreach (string zipArchive in zipArchives) { fInfos = FtpHelper.GetFilesOperationInfoFromZip(zipArchive).ToArray(); bool flag = FtpHelper.UploadArchive(zipArchive, AppHelper.Configuration.ZipCode, out uploadEx); if (flag) { SQLHelper.WriteFileOperationInfo(fInfos); } if (uploadEx != null) { AppHelper.CreateMessage("Ошибка при повторной отправке архива: " + uploadEx.ToString(), MessageType.Error, false, false, true); } } } } catch (Exception ex) { AppHelper.CreateMessage("Ошибка при повторной отправке архива: " + ex.ToString(), MessageType.Error, false, false, true); } // Запаковываем файлы в архив string zipName = Path.Combine(AppHelper.TempFtpPath, string.Format("{0}_{1}.zip", AppHelper.Configuration.ZipCode, DateTime.Now.ToString("dd_MM_yyyy_HH_mm_ss"))); fInfos = FtpHelper.PackFiles(AppHelper.TempTasksPath, zipName); if (fInfos != null) { foreach (FileOperationInfo fInfo in fInfos) { AppHelper.CreateMessage(string.Format("Упакован файл {0} из задачи {1} в {2}", fInfo.FileName, fInfo.TaskName, fInfo.OperationDate), MessageType.Information); } // Закачиваем архив на ftp bool flag = FtpHelper.UploadArchive(zipName, AppHelper.Configuration.ZipCode, out uploadEx); if (flag) { SQLHelper.WriteFileOperationInfo(fInfos); } if (uploadEx != null) { throw uploadEx; } } } catch (Exception ex) { AppHelper.CreateMessage("Ошибка: " + ex.ToString(), MessageType.Error, false, true, true); } finally { AppHelper.IsRunning = false; GUIController.LoadingState = false; } }
private static void Main(string[] argc) { try { if (!AppHelper.PreInit()) { return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Assembly execAssembly = Assembly.GetExecutingAssembly(); AppHelper.GUID = ((GuidAttribute)execAssembly.GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value; string mutexId = string.Format("Global\\{{{0}}}", AppHelper.GUID); bool createdNew; MutexAccessRule allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow); MutexSecurity securitySettings = new MutexSecurity(); securitySettings.AddAccessRule(allowEveryoneRule); using (Mutex mutex = new Mutex(false, mutexId, out createdNew, securitySettings)) { bool hasHandle = false; try { try { hasHandle = mutex.WaitOne(3000, false); if (hasHandle == false) { if (AppHelper.ARGS.FirstOrDefault(x => x.ToLower() == "-f") != null) { AppHelper.CreateMessage("Выполнен запуск по требованию", MessageType.Information); NamedPipeListener <string> .SendMessage(AppHelper.ProductName, "force"); } else { MessageBox.Show("Программа уже запущена", AppHelper.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); } return; } } catch (AbandonedMutexException err) { AppHelper.CreateMessage("Ошибка синхронизации Mutex: " + err.ToString(), MessageType.Error, true); hasHandle = true; } if (CheckDependencies()) { if (!SecurityHelper.IsAdministrator()) { AppHelper.CreateMessage("Программу необходимо запускать от имени администратора", MessageType.Error, true); return; } Application.Run(new MainForm()); } else { AppHelper.CreateMessage("Неверная версия Feodosiya.Lib.dll. Необходимая версия: >=" + MinFeodosiyaLibVer, MessageType.Error, true); return; } } finally { if (hasHandle) { mutex.ReleaseMutex(); } } } } catch (Exception ex) { AppHelper.CreateMessage(ex.ToString(), MessageType.Error, true); } }