none
Lambda Expression - O que esta errado? RRS feed

  • Pergunta

  • Bom dia galera,

    Estou tentando usar este método para zipar um XML e jogar para download mas não consigo.

    Estou usando a biblioteca DotNetZip.
    using (var zip = new Ionic.Zip.ZipFile())
            {
                zip.AddFileFromStream(chave+".xml",null,(name, stream) => doc.Save(stream));
                
                zip.Save(Response.OutputStream);
            }
    Me retorna o seguinte erro:
    "Cannot convert lambda expression to type 'System.IO.Stream' because it is not a delegate type".

    Agradeço a ajuda.

    Atte,

    Rodrigo.





    quinta-feira, 11 de fevereiro de 2010 12:24

Respostas

  • Bom, resolvi o problema... deixei como Byte[] mesmo.

    Byte[] blobb;
    
    while (reader.Read())
            {
                blobb = new Byte[(reader.GetBytes(6, 0, null, 0,
                                 int.MaxValue))];
                try
                {
                    reader.GetBytes(6, 0, blobb, 0, blobb.Length);
                }
                catch
                {
                }
            }
    using (var zip = new Ionic.Zip.ZipFile())
            {
                Response.Clear();
                zip.AddEntry(chave + ".xml", blobb);
                zip.Save(Response.OutputStream);
            }

    Agradeço a ajuda.

    Abs.
    sexta-feira, 12 de fevereiro de 2010 10:35

Todas as Respostas

  • Rodrigo,

    O quê você está querendo fazer especificamente?

    É só passar a stream alí no último parâmetro... Não precisa de Lambda Expression, pelo que eu entendi...
    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Sugerido como Resposta Danimar Ribeiro quinta-feira, 11 de fevereiro de 2010 13:29
    quinta-feira, 11 de fevereiro de 2010 13:19
    Moderador
  • Rodrigo,

    Pelo que pesquisei na documentação do DotNetZipLib esse método possui a seguinte assinatura.

    AddFileFromStream(string fileName, string directoryPathInArchive, Stream stream);

    Você quer transformar uma expressão lambda em uma Stream? Não tem sentido algum. Conforme o erro mostra: "Stream não é um delegate".

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com

    • Sugerido como Resposta Danimar Ribeiro quinta-feira, 11 de fevereiro de 2010 13:29
    quinta-feira, 11 de fevereiro de 2010 13:20
    Moderador
  • Certo, então como posso usar o XmlDocument ou um MemoryStream nesse caso? Já que quando uso o MemoryStream retorna um erro:

    "Não é possível acessar um fluxo fechado."

    Eu peguei isso deste exemplo:

    XmlDocument doc = .... ;
    using (var zip = new Ionic.Zip.ZipFile())
    {
        zip.AddEntry("NameOfTheDocInTheZipFile.xml", (name,stream)=> doc.Save(stream));
        zip.Save("MyZippedXml.zip");
    }


    quinta-feira, 11 de fevereiro de 2010 15:11
  • Rodrigo,

    Entre as duas opções: XmlDocument e MemoryStream, eu diria que você teria que utilizar um MemoryStream, pois o mesmo herda de Stream. Agora, não vi nenhum objeto desse tipo em seu código.

    Por favor, dê mais detalhes para que possamos ajudá-lo.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    sexta-feira, 12 de fevereiro de 2010 01:16
    Moderador
  • Bom, resolvi o problema... deixei como Byte[] mesmo.

    Byte[] blobb;
    
    while (reader.Read())
            {
                blobb = new Byte[(reader.GetBytes(6, 0, null, 0,
                                 int.MaxValue))];
                try
                {
                    reader.GetBytes(6, 0, blobb, 0, blobb.Length);
                }
                catch
                {
                }
            }
    using (var zip = new Ionic.Zip.ZipFile())
            {
                Response.Clear();
                zip.AddEntry(chave + ".xml", blobb);
                zip.Save(Response.OutputStream);
            }

    Agradeço a ajuda.

    Abs.
    sexta-feira, 12 de fevereiro de 2010 10:35
  • Rodrigo,

    Crie um MemoryStream com base em seu array de bytes e envie como argumento do método.

    var memStream = new MemoryStream();
    memStream.Write(blobb, 0, blobb.Length);
    memStream.Seek(0, SeekOrigin.Begin);
    ...
    zip.AddEntry(chave + ".xml", memStream);


    Obs: Não testei o código.

    Att.

    Ari C. Raimundo
    MCAD, MCP
    http://araimundo.blogspot.com
    sexta-feira, 12 de fevereiro de 2010 12:00
    Moderador