Правильный способ скопировать файл построчно в другой файл? - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно открыть файл, прочитать строку и, если эта строка соответствует некоторым условиям, записать ее в другой файл, строка, которую я читаю, является обычной строкой ASCII, представляющей значения HEX, и мне нужно вставить ее в новыйфайл как значения HEX, а не как строка ASCII.

У меня есть следующее:

private void Button_Click(object sender, RoutedEventArgs e)
{
    byte[] arrayByte = { 0x00 };
    var linesToKeep = File.ReadLines(fileName).Where(l => l.Contains(":10"));
    foreach (string line in linesToKeep)
    {

        string partialA = line.Substring(9);
        string partialB = partialA.Remove(partialA.Length - 2);
        arrayByte = ToByteArray(partialB);
        using (var stream = new FileStream(fileName+"_gugggu", FileMode.OpenOrCreate))
        {
            FileInfo file = null;
            file = new FileInfo(fileName + "_gugggu");
            stream.Position = file.Length;
            stream.Write(arrayByte, 0, arrayByte.Length);
        }
    }
}
public static byte[] ToByteArray(String HexString)
{
    int NumberChars = HexString.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
    {
        bytes[i / 2] = Convert.ToByte(HexString.Substring(i, 2), 16);
    }
    return bytes;
}

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

1 Ответ

0 голосов
/ 18 сентября 2018

Как указано в комментариях, вы практически продолжаете открывать и закрывать файл назначения. Вы делаете это для каждой строки в исходном файле, это приводит к огромным и ненужным накладным расходам.

Нет необходимости закрывать, повторно открывать и заново устанавливать позицию потока при каждом чтении строки из исходного файла.

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

Результат:

Test_Result

Как вы видите, оно завершается за 1/3 секунды.

Код:

private Stopwatch sw = new Stopwatch();
private FileInfo _sourceFile = new FileInfo(@"D:\source.txt");
private FileInfo _destinationFile = new FileInfo(@"D:\destination.hex");

private void ConvertFile()
{
    sw.Start();
    using (var streamReader = new StreamReader(_sourceFile.OpenRead()))
    {
        using (var streamWrite = _destinationFile.OpenWrite())
        {
            while (!streamReader.EndOfStream)
            {
                string line = streamReader.ReadLine();
                if (line.Contains(" x"))
                {
                    var array = ToByteArray(line);
                    streamWrite.Write(array, 0, array.Length);
                }
            }
        }
    }
    sw.Stop();
    MessageBox.Show("Done in " + sw.Elapsed);
}

private byte[] ToByteArray(string hexString)
{
    return hexString.ToList().ConvertAll(c => Convert.ToByte(c)).ToArray();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    ConvertFile();
}

НТН

...