2010-09-14 26 views
10

Me gustaría encadenar varias operaciones de flujo (como descargar un archivo, descomprimirlo sobre la marcha y procesar los datos sin ningún archivo temporal). Los archivos están en formato 7z. Hay un SDK de LZMA disponible, pero me obliga a crear un flujo de salida externo en lugar de ser un flujo en sí mismo; en otras palabras, el flujo de salida deberá escribirse completamente antes de poder trabajar con él. Parece que a SevenZipSharp le falta esta funcionalidad.Tratamiento de archivos 7z como transmisiones .NET

¿Alguien ha hecho algo así?

// in pseudo-code - CompressedFileStream derives from Stream 
foreach (CompressedFileStream f in SevenZip.UncompressFiles(Web.GetStreamFromWeb(url)) 
{ 
    Console.WriteLine("Processing file {0}", f.Name); 
    ProcessStream(f); // further streaming, like decoding, processing, etc 
} 

Cada secuencia de archivo se comportaría como una lectura corriente una vez que representa un archivo, y llamar a MoveNext() en la corriente principal comprimido invalidaría automáticamente & omitir ese archivo.

Se pueden realizar construcciones similares para la compresión. Ejemplo de uso: realice una agregación en una gran cantidad de datos: para cada archivo 7z en un directorio, para cada archivo interno, para cada línea de datos en cada archivo, resuma algún valor.

ACTUALIZACIÓN 2012-01-06

#ziplib (SharpZipLib) ya lo hace exactamente lo que necesito para archivos zip con la ZipInputStream clase. Aquí hay un ejemplo que produce todos los archivos como transmisiones no insertables dentro de un archivo zip dado. Todavía estoy buscando la solución 7z.

IEnumerable<Stream> UnZipStream(Stream stream) 
{ 
    using (var zipStream = new ZipInputStream(stream)) 
    { 
     ZipEntry entry; 
     while ((entry = zipStream.GetNextEntry()) != null) 
      if (entry.IsFile) 
       yield return zipStream; 
    } 
} 

Respuesta

0

El algoritmo subyacente y los parámetros especificados en el momento de la compresión determinan el tamaño de los trozos utilizados y no hay manera de garantizar que a medida que decodificar trozos, caen en los límites de la palabra/línea. Por lo tanto, deberá descomprimir por completo un archivo antes de procesarlo.

Lo que está pidiendo que hacer es probablemente no es posible sin archivos temporales - lo que realmente depende es si usted tiene suficiente memoria para mantener el archivo descomprimido abierta a través de una MemoryStream, lleve a cabo toda su procesamiento y luego liberar la memoria de vuelta a la piscina. Complicando aún más esto es la fragmentación (de la memoria de proceso) que podría causar al hacer esto repetidamente.

+0

No estoy seguro de entender lo que quiere decir con los límites de palabra/línea. El objeto 'CompressedFileStream' se devuelve en el momento en que SevenZip recibe el encabezado del archivo de la transmisión, no después de obtener todo el archivo. La lectura de los datos del archivo descomprimido también hace que la secuencia fuente avance. – Yurik

Cuestiones relacionadas