Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
supertreta

C# - zip de ficheiros

Recommended Posts

supertreta

Boas,

Preciso de criar um array de bytes final, com o zip de diferentes colecções de bytes. Não quero gerar ficheiros durante o processo. Tenho feito o seguinte excerto de código:

__________________________________________________ ______________________________

using ICSharpCode.SharpZipLib.Zip;

(...)

FileStream tempFileStream = new FileStream(@"C:\teste.zip", FileMode.Open, FileAccess.ReadWrite, FileShare.None);

Stream compressedContents = new MemoryStream();
ZipOutputStream zipOutput = new ZipOutputStream(compressedContents);
zipOutput.SetLevel(5);

for (int i = 0; i < attachments.Count; i++) //attachments -> byte [][]
{

    ZipEntry entry = new ZipEntry(attachsNames);
    entry.DateTime = DateTime.Now;
    entry.Size = attachments.Length;
    zipOutput.PutNextEntry(entry);
    zipOutput.Write(attachments, 0, attachments.Length);

}

zipOutput.Finish();
zipOutput.Flush();

byte[] buffer = new byte[compressedContents.Length];
compressedContents.Read(buffer, 0, (int)compressedContents.Length);

tempFileStream.Write(buffer, 0, (int)compressedContents.Length);
tempFileStream.Close();

zipOutput.Close();
compressedContents.Close();

__________________________________________________ ______________________________

O ficheiro criado serve apenas para teste. Quando o tento abrir surge o erro típico de quando um ficheiro está corrompido: "can not open teste.zip as a archive".

Se a variável compressedContents for um FileStream em vez de uma memoryStream, o ficheiro de teste resultante é gerado correctamente. No entanto, só pretendo ficar com array de bytes final. Não o pretendo criar com writes e reads ao disco através ficheiros temporários..

O prob deve estar na forma como manipulo a memoryStream.. Alguma ideia?

Cumps

Supertreta

Edit M6: inserido syntax highlight no código.

Share this post


Link to post
Share on other sites
msr

Já me aconteceu uma coisa identica.

O que eu fiz foi: estava a usar um buffer de bytes com 50 "posições" e aumentei para 128. Porquê 128? Porque é um numero maior e é mais bonito :) Sinceramente não sei qual seria o problema com os 50, mas depois de ter aumentado o tamanho do buffer, passou a funcionar.

Não sei se te ajuda, mas aqui fica o testemunho.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.