La forma más eficiente de comparar un flujo de memoria con un archivo C# .NET

 C Programming >> Programación C >  >> Tags >> .NET
La forma más eficiente de comparar un flujo de memoria con un archivo C# .NET

Otra solución:

private static bool CompareMemoryStreams(MemoryStream ms1, MemoryStream ms2)
{
    if (ms1.Length != ms2.Length)
        return false;
    ms1.Position = 0;
    ms2.Position = 0;

    var msArray1 = ms1.ToArray();
    var msArray2 = ms2.ToArray();

    return msArray1.SequenceEqual(msArray2);
}

En primer lugar, obtener el código hash de las dos transmisiones no ayudará:para calcular los códigos hash, debe leer el contenido completo y realizar algunos cálculos simples mientras lee. Si compara los archivos byte a byte o usa búferes, entonces puede detenerse antes (después de encontrar los primeros dos bytes/bloques) que no coinciden.

Sin embargo, este enfoque tendría sentido si necesitara comparar el MemoryStream contra varios archivos, porque entonces necesitaría recorrer el MemoryStream solo una vez (para calcular el código hash) y recorrer todos los archivos.

En cualquier caso, tendrás que escribir código para leer todo el archivo. Como mencionó, esto se puede hacer byte por byte o usando búferes. La lectura de datos en el búfer es una buena idea, ya que puede ser una operación más eficiente al leer desde el disco duro (por ejemplo, leer un búfer de 1kB). Además, podría usar BeginRead asíncrono método si necesita procesar varios archivos en paralelo.

Resumen :

  • Si necesita comparar varios archivos, use hashcode
  • Para leer/comparar el contenido de un solo archivo:
    • Lea 1kB de datos en un búfer de ambos flujos
    • Vea si hay alguna diferencia (si es así, abandone)
    • Continuar en bucle

Implemente los pasos anteriores de forma asíncrona usando BeginRead si necesita procesar varios archivos en paralelo.