Beispiel #1
0
        private void InitializeBindings()
        {
            ViewModel = new VM_Work();

            data = new DataTable();
            data.Columns.Add();
            dgvLog.DataSource = new BindingSource {
                DataSource = data
            };

            Timer timer = new Timer();

            timer.Interval = 20;
            timer.Enabled  = true;
            timer.Tick    += (o, ev) =>
            {
                pgStatus.Maximum = ViewModel.pgBarState.Maximum;
                pgStatus.Minimum = ViewModel.pgBarState.Minimum;
                pgStatus.Value   = ViewModel.pgBarState.Value;
                pgStatus.Style   = ViewModel.pgBarState.UnknownValue ? ProgressBarStyle.Marquee : ProgressBarStyle.Blocks;

                lblStatus.Text = ViewModel.LabelStatus;

                for (int records = 0; records < recordsPerTick; records++)
                {
                    if (!ViewModel.Log.TryDequeue(out string message))
                    {
                        break;
                    }
                    data.Rows.Add(message);
                }
            };
            timer.Start();
        }
Beispiel #2
0
        public async void Convert(VM_Main vmMain, VM_Work vmWork)
        {
            var files = Directory.GetFiles(vmMain.PathToInputDirectory, extension).ToList();

            string outputPath = Path.Combine(vmMain.PathToInputDirectory, outputDirectory);

            if (!Directory.Exists(outputPath))
            {
                Directory.CreateDirectory(outputPath);
            }

            int filesProcessed = 0;

            vmWork.pgBarState.Maximum = files.Count;

            string search = vmMain.Search;

            getAttributeToSearch(ref search, out string attributeToSearch);
            Regex  regex   = vmMain.UseRegularExpressions ? new Regex(search, RegexOptions.Compiled) : null;
            String replace = vmMain.NeedReplace ? (vmMain.Replace ?? "") : null;

            vmWork.Log.TryAdd($"Входная директория: {vmMain.PathToInputDirectory}");
            vmWork.Log.TryAdd($"Выходная директория: {outputPath}");
            if (vmMain.UseXSD)
            {
                vmWork.Log.TryAdd($"XSD схема для проверки: {vmMain.PathToXSD}");
            }
            vmWork.Log.TryAdd(logSearchLine(vmMain.UseRegularExpressions, search, attributeToSearch));
            if (vmMain.NeedReplace)
            {
                vmWork.Log.TryAdd($"Заменять на: {vmMain.Replace}");
            }

            Stopwatch   elapsedTotal = Stopwatch.StartNew();
            List <Task> tasks        = new List <Task>();

            foreach (var file in files)
            {
                var task = Task.Factory.StartNew(() =>
                {
                    string filename   = Path.GetFileName(file) ?? throw new ArgumentException("Can't get short path for: " + file);
                    Stopwatch elapsed = Stopwatch.StartNew();

                    try
                    {
                        XmlDocument xml = new XmlDocument();
                        xml.Load(file);
                        if (vmMain.UseXSD)
                        {
                            xml.Schemas.Add(null, vmMain.PathToXSD);
                        }

                        if (!ValidateXSD(xml))
                        {
                            vmWork.Log.TryAdd("ОШИБКА: Документ не соответствует XSD схеме");
                            goto method_end;
                        }

                        var result = Search(xml, vmMain.XPath, search, regex, attributeToSearch);
                        vmWork.Log.TryAdd($"Найдено {result.Item1} значений в документе");

                        if (vmMain.NeedReplace)
                        {
                            Replace(xml, result.Item2, search, replace, regex);

                            if (!ValidateXSD(xml))
                            {
                                vmWork.Log.TryAdd("ОШИБКА: После замены документ не соответствует XSD схеме");
                                goto method_end;
                            }

                            xml.Save(Path.Combine(outputPath, filename));
                        }

                        method_end:;
                    }
                    catch (XmlException ex)
                    {
                        vmWork.Log.TryAdd($"ОШИБКА: {ex.Message} в документе {filename}");
                    }

                    vmWork.Log.TryAdd($"Документ \"{filename}\" обработан за {elapsed.Elapsed}ms");
                    vmWork.pgBarState.Value = Interlocked.Increment(ref filesProcessed);
                    vmWork.LabelStatus      = $"Обработано документов: {vmWork.pgBarState.Value}/{vmWork.pgBarState.Maximum} (через {TaskScheduler.Current.GetType().Name})";
                });
                tasks.Add(task);
            }

            await Task.WhenAll(tasks.ToArray());

            elapsedTotal.Stop();
            vmWork.Log.TryAdd($"Суммарное время обработки {files.Count} документов: {elapsedTotal.Elapsed}");
        }