Exemple #1
0
        /// <summary>
        /// Метод запускает задание сопоставления имен файлов по ключам во входящей папке по заданным правилам
        /// </summary>
        public void Execute()
        {
            _log.Info(string.Format("Запуск задания... Key:  {0}, Source: '{1}', SourceMask: '{2}', Destination: '{3}', CompareMask: {4}', Archive: {5}', DataBinding: '{6}', Overwrite: {7}", Key, Source, SourceMask, Destination, CompareMask, ArchivePath, DataBinding, Overwrite));

            // Проверка на доступность объекта
            if (Enabled)
            {
                #region Инициализация счетчиков

                int _processed = 0;
                int _success   = 0;
                int _errors    = 0;
                int _warnings  = 0;

                #endregion

                // Создание объекта для получения данных из каталога ресурсов
                Debug("Конфигурирование объекта SourceCatalogEntityChecker...");
                var _checker = new SourceCatalogEntityChecker(ConfigurationManager.AppSettings.Get("ECR_Config.Database.Connection.ConnectionString"), DataBinding);

                #region Формирование маски для выборки файлов из папки

                Debug("Определение маски для выборки...");

                var _mask = _sourceMask.Replace("[ext]", "*");
                for (var i = 0; i < __key_tokens.Length; i++)
                {
                    _mask = _mask.Replace(__key_tokens[i], "*");
                }
                _mask = _mask.Replace(__number_token, "*");

                #endregion

                // input

                #region Формирование токена для поиска позиции по ключу

                Debug("Формирование токена для поиска позиции...");

                var _input_key_token = string.Empty;
                for (var i = 0; i < __key_tokens.Length; i++)
                {
                    if (SourceMask.IndexOf(__key_tokens[i]) <= -1)
                    {
                        continue;
                    }
                    _input_key_token = __key_tokens[i];
                    break;
                }

                // Идентифицирующий позицию ключ всегда один, если по факту это не так - генерируем исключение
                if (_input_key_token.Length == 0)
                {
                    throw new Exception("Входящий токен не определен или определен некорректно");
                }

                // number

                // Идентифицирующий номер всегда один, определяем из маски исходного файла
                var _number_token = string.Empty;
                if (SourceMask.IndexOf(__number_token) > -1)
                {
                    _number_token = __number_token;
                }

                #endregion

                // output

                #region Формирование токена ключа для подстановки в output

                Debug("Формирование токена ключа для подстановки в output...");

                var _output_key_token = string.Empty;
                for (var i = 0; i < __key_tokens.Length; i++)
                {
                    if (CompareMask.IndexOf(__key_tokens[i]) > -1)
                    {
                        _output_key_token = __key_tokens[i];
                        break;
                    }
                }
                if (_output_key_token.Length == 0)
                {
                    throw new Exception("Исходящий токен не определен или определен некорректно");
                }

                #endregion

                // Получение списка файлов, находящихся в исходной папке
                Debug("Получение списка исходных файлов...");
                var _files = Directory.GetFiles(Source, _mask);

                if (_files.Length > 0)
                {
                    Debug("Проверка имен файлов...");
                    for (var i = 0; i < _files.Length; i++)
                    {
                        try
                        {
                            Debug(string.Format("Обрабатывается файл: '{0}'...", _files[i]));
                            _processed++;

                            // Замена [ext] и расширения файла в шаблоне названия исходного файла
                            var _pattern = SourceMask.Replace("[ext]", Path.GetExtension(_files[i]).Replace(".", ""));
                            _pattern = _pattern.Replace(Path.GetExtension(_files[i]), "");

                            Debug(string.Format("'{0}': входящий шаблон сконфигурирован", _files[i]));

                            // Получение значений входящих токенов для key и number

                            var _number = string.Empty;
                            if (_number_token.Length > 0)
                            {
                                _number = GetKeyTokenValue(Path.GetFileName(_files[i]), _pattern, _number_token, _input_key_token);
                            }

                            var _input_key = GetKeyTokenValue(Path.GetFileName(_files[i]).Replace("_" + _number, string.Empty).Replace("__", "_"), _pattern, _input_key_token, "_" + _number_token);
                            Debug(string.Format("'{0}': входящий ключ сконфигурирован", _files[i]));

                            if (_number.Length > 0)
                            {
                                while (_number.Substring(0, 1) == "0")
                                {
                                    _number = _number.Substring(1, _number.Length - 1);
                                }
                            }
                            Debug(string.Format("'{0}': input number configured", _files[i]));


                            // Проверяем существование товарной позиции в каталоге
                            Debug(string.Format("Проверка существования элемента... Key type: '{0}', key value: '{1}'", _input_key_token, _input_key));
                            if (!_checker.CheckItemExists(_input_key_token.Replace("[", "").Replace("]", ""), _input_key))
                            {
                                _log.Warn(string.Format("Элемент не задан в исходном каталоге. Key type: '{0}', key value: '{1}', source file: '{2}'", _input_key_token, _input_key, _files[i]));
                                _warnings++;

                                // Если задан путь для разрешения конфликтов - перемещаем файл по заданному пути (overwrite = true)
                                if (ConflictsPath.Length > 0)
                                {
                                    Debug(string.Format("Копирование файла в папку конфликтов: '{0}'", _files[i]));
                                    File.Copy(_files[i], ConflictsPath + Path.GetFileName(_files[i]), true);
                                    Debug(string.Format("'{0}': файл скопирован в папку конфликтов", _files[i]));
                                    Debug(string.Format("Удаление файла: '{0}'", _files[i]));
                                    File.Delete(_files[i]);
                                    Debug(string.Format("'{0}': файл успешно удален", _files[i]));
                                }
                            }
                            else
                            {
                                // Получаем значение ключа по исходному;
                                var _output_key = _checker.CompareKeys(_input_key_token.Replace("[", "").Replace("]", ""),
                                                                       _input_key,
                                                                       _output_key_token.Replace("[", "").Replace("]", ""));

                                Debug(string.Format("'{0}': исходящий ключ сконфигурирован", _files[i]));

                                // Определяем новое имя файла в соответствии с заданной маской
                                var _output_file_name = CompareMask.Replace("[ext]", Path.GetExtension(_files[i]).Replace(".", ""));
                                _output_file_name = _output_file_name.Replace(_output_key_token, _output_key);

                                if ((_number_token.Length > 0) & (CompareMask.IndexOf(_number_token) > -1))
                                {
                                    _output_file_name = _output_file_name.Replace(_number_token, _number);
                                }

                                Debug(string.Format("'{0}': исходящее имя файла определено", _files[i]));

                                // Если параметр Archive задан, то копируем файл в архив;
                                // Параметр OverwriteFiles определяет, нужно ли заменять файл, если он уже существует;
                                // В случае, если файл по каким-либо причинам не скопировался, генерируется наследуемый Exception;
                                // В случае, если файл существует и Overwrite = false генерируется наследуемый Exception;
                                if (ArchivePath.Length > 0)
                                {
                                    Debug(string.Format("КОпирование файла в папку архива: '{0}'", _files[i]));
                                    var _path_archive = ArchivePath + _output_file_name;
                                    File.Copy(_files[i], @_path_archive, Overwrite);
                                    Debug(string.Format("'{0}': файл скопирован в папку архива", _files[i]));
                                }

                                // Копируем файл с новым именем в целевую папку;
                                Debug(string.Format("Копирование файла в исходящую папку: '{0}'", _files[i]));
                                var _path_dest = Destination + _output_file_name;
                                File.Copy(_files[i], @_path_dest, Overwrite);
                                Debug(string.Format("'{0}': файл скопирован в исходящую папку", _files[i]));

                                // Удаляем файл из исходной папки
                                Debug(string.Format("Удаление файла: '{0}'", _files[i]));
                                File.Delete(_files[i]);
                                Debug(string.Format("'{0}': файл удален", _files[i]));

                                _log.Info(string.Format("Файл успешно переименован: '{0}', исходящее имя файла: '{1}'", _files[i], _path_dest));
                                _success++;
                            }
                        }
                        catch (Exception e)
                        {
                            _log.Error(string.Format("Ошибка переименования файла. Файл: '{0}'", _files[i]), e);
                            _errors++;
                        }
                    }
                }

                _log.Info(string.Format("Задание выполнено успешно: {0}. Обработано: {1}, успешно: {2}, с ошибками: {3}, предупреждений: {4}.", Key, _processed, _success, _errors, _warnings));
            }
            else
            {
                // Если объект недоступен, то пишем в лог и выходим
                _log.Warn(string.Format("Задание: {0} заблокировано. Задание неактивно либо доступ запрещен", Key));
            }
        }