Pergunta

Meu TCP cliente recebe uma imagem dentro de uma imagem packet.The é comprimido com tarefa zlib.The é descomprimir a imagem e colocá-lo no formulário.

Estou planejando para salvar a imagem compactada no diretório atual, descompactá-lo e carregar o arquivo descompactado no formulário.

O primeiro problema vem com salvar o arquivo (comprimido) .A zlib pode salvá-lo descomprimido.

O código a seguir carrega o arquivo compactado e salva-lo após a descompressão.

    private void decompressFile(string inFile, string outFile)
    {
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream);
        System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);          
        try
        {
            CopyStream(inFileStream, outZStream);
        }
        finally
        {
            outZStream.Close();
            outFileStream.Close();
            inFileStream.Close();
        }
    }

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000];
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }

Como passar o byte [] array diretamente para essa função? Estou planejando para salvá-lo como comprimido e, em seguida, chamar a função com a localização do arquivo compactado, mas eu não sei nem como salvar um arquivo a partir de uma matriz byte [], nem uma maneira de passar o byte [] array como o arquivo de entrada.

Qualquer ajuda será muito apreciada.

Graças.

Foi útil?

Solução

Use as System.IO.File.WriteAllBytes static void (string path, byte [] bytes) método.

byte[] buffer = new byte[200];
File.WriteAllBytes(@"c:\data.dmp", buffer);

Outras dicas

public static void SaveFile(this Byte[] fileBytes, string fileName)
{
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
    fileStream.Write(fileBytes, 0, fileBytes.Length);
    fileStream.Close();
}

Além do que todos os outros já declarou, eu também sugiro que você use 'usando' cláusulas já que todos esses objetos implementar IDisposable.

using(FileStream outFileStream = new ...)
using(ZOutputStream outZStream = new ...)
using(FileStream inFileStream = new ...)
{
    CopyStream(inFileStream, outZStream);
}

Vara da matriz de bytes que você recebeu em um MemoryStream e comprimir / descomprimir na mosca sem usar arquivos temporários.

Você pode tentar este código

 private void t1()
    {
        FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open);
        int length = Convert.ToInt16(f1.Length);
        Byte[] b1 = new Byte[length];
        f1.Read(b1, 0, length);
        File.WriteAllBytes("C:\\myfile.txt",b1);
        f1.Dispose();
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top