Ввод данных StreamReader в словарь - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу получить значения из моего вывода (из потокового чтения и чтения его построчно) в словарь, используя c #.Вывод выглядит как нижеприведенный скриншот, где он выполняется для каждого файла.Показанный вывод только для 1 файла, и есть несколько выходных файлов, подобных этому.

Я хотел назначить путь к файлу [Например, c: \ testing \ sp1aexpress_ru.exe] в качестве ключа, а остальные значения -значения в словарь.Не могли бы вы подсказать, как мне решить эту задачу?

Пока что я написал следующий код.Несмотря на Console.WriteLine (строка), я хочу ввести это в словарь.

Process process = new Process();
process.StartInfo.FileName = Pathdir + "\\test.exe";
process.StartInfo.Arguments = "-a -h -s " + dir;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();

using (StreamReader streamReader = process.StandardOutput)
{
    while (!streamReader.EndOfStream)
    {
        string line = streamReader.ReadLine();
        Console.WriteLine(line);
    }
}

Вывод:

c: \ testing \ sp1aexpress_ru.exe:

Проверено: Подпись

Дата подписания: 11: 29 AM 1/27/2003

Дата подписания: 11: 29 AM 1/27/2003

CertСтатус: Подписано

Допустимое использование: Подписывание кода

Сертификат эмитента: Подписывание кода Microsoft PCA

Серийный номер: 61 07 11 43 00 00 00 00 00 34

Отпечаток: 282D9806C3DF7345929F64F5895EF2EA4AC29302

c: \ testing \ WindowsRightsManagementServicesSP2-KB979099-Client-amd64-ENU.exe:

Проверено: подписано

подписано *1034*дата: 01: 35 PM 1/14/2010

дата подписания: 1:35 PM 1/14/2010

Подписывающие лица:

Microsoft Corporation

Статус сертификата: Подпись

Допустимое использование: подпись кода

Эмитент сертификата: Microsoft Code Signing PCA

Серийный номер: 61 01 CF 3E 00 00 00 00 00 0F

Отпечаток большого пальца: 9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F

1 Ответ

0 голосов
/ 11 декабря 2018

Это очень сложно и, вероятно, не сработает в первый раз.Я разбираю текстовые файлы более 40 лет, и мне всегда приходится вносить небольшие изменения в сложные форматы, особенно если у вас несколько подписывающих, например, этот код.Попробуйте код и дайте мне знать, если есть какие-либо проблемы.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;

namespace ConsoleApplication91
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            Certificate.Add(FILENAME);
        }
    }
    public enum STATE
    {
        HEADER_FIRST_ROW,
        HEADER_NOT_FIRST_ROW,
        SIGNER_NAME,
        SIGNER_DATA
    }
    public class Certificate
    {
        public static Dictionary<string, Certificate> certificateDictionary = new Dictionary<string, Certificate>();

        public string filename { get;set;}
        public string verified { get; set; }
        public DateTime signingDate1 { get; set; }
        public DateTime signingDate2 { get; set; }
        public string catalog { get; set; }
        public List<Signer> signers { get; set; }

        public static void Add(string filename)
        {
            IFormatProvider provider = CultureInfo.InvariantCulture;
            StreamReader reader = new StreamReader(filename);
            string line = "";
            Certificate certificate = null;
            int dateCount = 0;
            Signer signer = null;
            string name = "";
            string value = "";
            STATE state = STATE.HEADER_FIRST_ROW;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    switch (state)
                    {
                        case STATE.HEADER_FIRST_ROW:
                            certificate = new Certificate();
                            certificate.filename = line;
                            certificateDictionary.Add(certificate.filename, certificate);
                            dateCount = 0;
                            state = STATE.HEADER_NOT_FIRST_ROW;
                            break;
                        case STATE.HEADER_NOT_FIRST_ROW:
                            name = line.Substring(0, line.IndexOf(":")).Trim();
                            value = line.Substring(line.IndexOf(":") + 1).Trim();

                            switch (name)
                            {
                                case "Verified":
                                    certificate.verified = value;
                                    break;
                                case "Signing date":
                                    if (dateCount == 0)
                                    {
                                        dateCount = 1;
                                        certificate.signingDate1 = DateTime.ParseExact(value, "h:mm tt M/dd/yyyy", provider);
                                    }
                                    else
                                    {
                                        certificate.signingDate2 = DateTime.ParseExact(value, "h:mm tt M/dd/yyyy", provider);
                                    }
                                    break;
                                case "Catalog":
                                    certificate.catalog = value;
                                    break;
                                case "Signers":
                                    state = STATE.SIGNER_NAME;
                                    break;
                            }
                            break;

                        case STATE.SIGNER_NAME:
                            if(certificate.signers == null) certificate.signers = new List<Signer>();
                            signer = new Signer();
                            certificate.signers.Add(signer);
                            signer.name = line;
                            state = STATE.SIGNER_DATA;
                            break;
                        case STATE.SIGNER_DATA:
                            name = line.Substring(0, line.IndexOf(":")).Trim();
                            value = line.Substring(line.IndexOf(":") + 1).Trim();

                            switch (name)
                            {
                                case "Cert Status":
                                    signer.certificateStatus = value;
                                    break;
                                case "Valid Usage":
                                    signer.validUsage = value;
                                    break;
                                case "Cert Issuer":
                                    signer.certIssuer = value;
                                    break;
                                case "Serial Number":
                                    signer.serialNumber = value;
                                    break;
                                case "Thumbprint":
                                    signer.thumbPrint  = value;
                                    break;
                                case "Valid from":
                                    signer.fromDate = DateTime.ParseExact(value, "h:mm tt M/dd/yyyy", provider);
                                    break;
                                case "Valid to":
                                    signer.toDate = DateTime.ParseExact(value, "h:mm tt M/dd/yyyy", provider);
                                    state = STATE.SIGNER_NAME;
                                    break;
                            }
                            break;
                    }

                }
            }

        }
        public class Signer
        {
            public string name { get; set; }
            public string certificateStatus { get; set; }
            public string validUsage { get; set; }
            public string certIssuer { get; set; }
            public string serialNumber { get; set; }
            public string thumbPrint { get; set; }
            public DateTime fromDate { get; set; }
            public DateTime toDate { get; set; }
        }

    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...