¿Cómo extraer o acceder a la transmisión a un archivo específico en gzip usando SharpZipLib?

¿Cómo extraer un archivo específico (o tener acceso de transmisión) de tar.gz (archivos y carpetas tar y luego comprimidos con gzip) usando SharpZipLib? ¿O tal vez alguien tiene alguna biblioteca similar para hacer eso en .NET cf 3.5?

preguntado el 31 de julio de 12 a las 13:07

2 Respuestas

using ( FileStream inputStream = File.OpenRead ( aPackage ) )
{
    using ( GzipInputStream gzStream = new GzipInputStream ( inputStream ) )
    {
        using ( TarInputStream tarStream = new TarInputStream ( gzStream ) )
        {
            TarEntry entry = tarStream.GetNextEntry();
            while ( entry != null )
            {
                if ( entry == theOneIWant )
                {
                    tarStream.CopyEntryContents (outputStream );
                    break;
                }
                entry = tarStream.GetNextEntry();
            }
        }
    }
}

Respondido 01 ago 12, 07:08

¿Cómo podría identificar la entrada "theOneIWant"? Pensé que tendrías que encontrarlo por su nombre, ¿hay otra forma? :) - Faraday

@Vijay usando cualquiera de las propiedades de TarEntry, que probablemente sería Nombre (o Archivo). No puedo hacerlo demasiado fácil ahora, ¿verdad? :D - Thomas

¿Cuál es el flujo de salida aquí? como se inicializa? - Sarang Borudé

@SarangBorude outputStream podría ser cualquier transmisión en la que pueda escribir, ya sea una transmisión de memoria o una transmisión de archivos. - Thomas

Esto debería hacerlo por ti.

public static void Main(string[ args)
{
    TarInputStream tarIn = new TarInputStream(new FileStream(@args[0], FileMode.Open, FileAccess.Read));
    TarEntry curEntry = tarIn.GetNextEntry();
    while (curEntry != null)
    {
        if (curEntry.Name.EndsWith("foo.txt", StringComparison.CurrentCultureIgnoreCase))
        {
            byte[] outBuffer = new byte[curEntry.Size];
            FileStream fs = new FileStream(@"foo.txt", FileMode.Create, FileAccess.Write);
            BinaryWriter bw = new BinaryWriter(fs);
            tarIn.Read(outBuffer, 0, (int)curEntry.Size);
            bw.Write(outBuffer,0,outBuffer.Length);
            bw.Close();
        }
        curEntry = tarIn.GetNextEntry();
    }
    tarIn.Close();
}

Respondido el 22 de Septiembre de 17 a las 11:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.