Самый эффективный способ сравнить memorystream с файлом C#.NET

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

У меня была пара мыслей о вопросе:

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

И затем конечно, я мог просто сравнить весь поток, но я не знаю, как быстрый, который был бы.

Что лучший способ состоит в том, чтобы сравнить MemoryStream с файлом? Байт байтом в для цикла?

9
задан devios1 5 June 2010 в 01:19
поделиться

1 ответ

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

Однако этот подход имел бы смысл, если бы вам нужно было сравнить MemoryStream с несколькими файлами, потому что тогда вам нужно было бы пройти через MemoryStream только один раз (чтобы вычислить hashcode) и перебрать все файлы.

В любом случае вам придется написать код для чтения всего файла. Как вы упомянули, это можно сделать побайтово или с помощью буферов. Чтение данных в буфер - хорошая идея, потому что это может быть более эффективной операцией при чтении с жесткого диска (например, чтение буфера размером 1 КБ). Более того, вы можете использовать асинхронный метод BeginRead , если вам нужно обрабатывать несколько файлов параллельно.

Сводка :

  • Если вам нужно сравнить несколько файлов, используйте хэш-код
  • Для чтения / сравнения содержимого одного файла:
    • Прочитать 1 КБ данных в буфер из обоих потоков
    • Проверить, есть ли разница (если да, выйти)
    • Продолжить цикл

Выполнить вышеуказанные шаги асинхронно, используя BeginRead , если вам нужно обрабатывать несколько файлов параллельно.

11
ответ дан 4 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: