Usuário com melhor resposta
Descompactar aquivo compactado em várias partes

Pergunta
-
Estou tentando descompactar arquivo compactado e várias partes, mas só consigo descompactar quando está em uma unica parte:
public static byte[] Descompatar(byte[] ArquivoCompactado, out string NomeArquivoCompactado)
{
MemoryStream ms = new MemoryStream(ArquivoCompactado);
ZipInputStream s = new ZipInputStream(ms);
ZipEntry theEntry = s.GetNextEntry();
NomeArquivoCompactado = theEntry.Name;
if (theEntry == null)
{
return new byte[0];
}
MemoryStream msRetorno = new MemoryStream();
int size = 2048;
byte[] data = new byte[size];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
msRetorno.Write(data, 0, size);
}
else
{
break;
}
}
if (s.GetNextEntry() != null)
{
throw new Exception("Existe mais de um arquivo dentro do arquivo compactado.");
}
s.Close();
msRetorno.Close();
return msRetorno.ToArray();
}
Respostas
-
Obrigado pelo ajuda.
O que fiz para resolver o meu problema no fim foi algo fácil, apenas criei um MemoryStream e nele coloquei todos as partes do arquivo a ser descompactado, utilizando o WriteTo da respectiva parte, depois utilizei a minha rotina atual para descompactar e pimba!!
Se aguem precisar segue rotina:
private void button1_Click(object sender, EventArgs e)
{
List<MemoryStream> listArquivosParticionados = new List<MemoryStream>();
DirectoryInfo nf = new DirectoryInfo(textBox1.Text);
MemoryStream aux = new MemoryStream();
MemoryStream ArquivoFinal = new MemoryStream();
string art = string.Empty;
//Pega os arquivos particionados
foreach (FileInfo item in nf.GetFiles())
{
FileStream fileInf = File.Open(item.FullName, FileMode.Open);
aux = new MemoryStream();
fileInf.CopyTo(aux);
listArquivosParticionados.Add(aux);
}
foreach (var item in listArquivosParticionados)
{
item.WriteTo(ArquivoFinal);
}
File.WriteAllBytes("c:\\ArquivoDescompactado\arquivo.mdb", Descompatar(ArquivoFinal, out art));
}
public static byte[] Descompatar(byte[] ArquivoCompactado, out string NomeArquivoCompactado)
{
MemoryStream ms = new MemoryStream(ArquivoCompactado);
ZipInputStream s = new ZipInputStream(ms);
ZipEntry theEntry = s.GetNextEntry();
NomeArquivoCompactado = theEntry.Name;
if (theEntry == null)
{
return new byte[0];
}
MemoryStream msRetorno = new MemoryStream();
int size = 2048;
byte[] data = new byte[size];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
msRetorno.Write(data, 0, size);
}
else
{
break;
}
}
if (s.GetNextEntry() != null)
{
throw new Exception("Existe mais de um arquivo dentro do arquivo compactado.");
}
s.Close();
msRetorno.Close();
return msRetorno.ToArray();
}
Todas as Respostas
-
Tente usar a biblioteca SharpZipLib, acredito que ela consiga fazer o que vc precisa.
Segue link de um post que escrevi a respeito da mesma:
http://netcoders.com.br/blog/manipulacao-de-arquivos-zip-com-sharpziplib/
-
Obrigado pelo ajuda.
O que fiz para resolver o meu problema no fim foi algo fácil, apenas criei um MemoryStream e nele coloquei todos as partes do arquivo a ser descompactado, utilizando o WriteTo da respectiva parte, depois utilizei a minha rotina atual para descompactar e pimba!!
Se aguem precisar segue rotina:
private void button1_Click(object sender, EventArgs e)
{
List<MemoryStream> listArquivosParticionados = new List<MemoryStream>();
DirectoryInfo nf = new DirectoryInfo(textBox1.Text);
MemoryStream aux = new MemoryStream();
MemoryStream ArquivoFinal = new MemoryStream();
string art = string.Empty;
//Pega os arquivos particionados
foreach (FileInfo item in nf.GetFiles())
{
FileStream fileInf = File.Open(item.FullName, FileMode.Open);
aux = new MemoryStream();
fileInf.CopyTo(aux);
listArquivosParticionados.Add(aux);
}
foreach (var item in listArquivosParticionados)
{
item.WriteTo(ArquivoFinal);
}
File.WriteAllBytes("c:\\ArquivoDescompactado\arquivo.mdb", Descompatar(ArquivoFinal, out art));
}
public static byte[] Descompatar(byte[] ArquivoCompactado, out string NomeArquivoCompactado)
{
MemoryStream ms = new MemoryStream(ArquivoCompactado);
ZipInputStream s = new ZipInputStream(ms);
ZipEntry theEntry = s.GetNextEntry();
NomeArquivoCompactado = theEntry.Name;
if (theEntry == null)
{
return new byte[0];
}
MemoryStream msRetorno = new MemoryStream();
int size = 2048;
byte[] data = new byte[size];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
msRetorno.Write(data, 0, size);
}
else
{
break;
}
}
if (s.GetNextEntry() != null)
{
throw new Exception("Existe mais de um arquivo dentro do arquivo compactado.");
}
s.Close();
msRetorno.Close();
return msRetorno.ToArray();
}