Uma matriz de bytes [] pode ser gravada em um arquivo em c #?


344

Estou tentando escrever uma Byte[]matriz que representa um arquivo completo para um arquivo.

O arquivo original do cliente é enviado via TCP e depois recebido por um servidor. O fluxo recebido é lido em uma matriz de bytes e enviado para ser processado por esta classe.

Isso é principalmente para garantir que a recepção TCPClientesteja pronta para o próximo fluxo e separar a extremidade de recebimento da extremidade de processamento.

A FileStreamclasse não aceita uma matriz de bytes como argumento ou outro objeto de Stream (que permite gravar bytes nela).

Meu objetivo é concluir o processamento por um thread diferente do original (aquele com o TCPClient).

Não sei como implementar isso, o que devo tentar?

Respostas:


728

Com base na primeira frase da pergunta: "Estou tentando escrever uma matriz de Byte [] que representa um arquivo completo para um arquivo".

O caminho de menor resistência seria:

File.WriteAllBytes(string path, byte[] bytes)

Documentado aqui:

System.IO.File.WriteAllBytes - MSDN


40

Você pode usar um BinaryWriterobjeto.

protected bool SaveData(string FileName, byte[] Data)
{
    BinaryWriter Writer = null;
    string Name = @"C:\temp\yourfile.name";

    try
    {
        // Create a new stream to write to the file
        Writer = new BinaryWriter(File.OpenWrite(Name));

        // Writer raw data                
        Writer.Write(Data);
        Writer.Flush();
        Writer.Close();
    }
    catch 
    {
        //...
        return false;
    }

    return true;
}

Edit: Opa, esqueci a finallyparte ... digamos que é deixada como um exercício para o leitor ;-)


Digamos que recebi dados compactados e descompactei em Byte []. É possível criar o arquivo de volta usando a função acima? Algum tutorial ou demonstração online?
Canhão

@uffer_overflow: você precisaria compactá-lo primeiro se quiser recuperar o arquivo original. Dê uma olhada no Decorator Pattern para uma possível implementação: en.wikipedia.org/wiki/Decorator_pattern
Treb

2
BinaryWriteré descartável, então provavelmente deve ser usado dentro de um usingbloco. Isso também significa que você provavelmente poderá interromper algumas chamadas extras, já que o código-fonte mostra que ele faz alguma limpeza durante a eliminação.
Jeff B


11

Você pode fazer isso usando o System.IO.BinaryWriterque leva um fluxo para:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);

7
Só quero acrescentar, após a gravação add bw.flush e bw.close
dekdev

6
@dekdev: Não há sentido em ligar Flush()antes, Close()pois Close()o fluxo será liberado. Melhor ainda é usar uma usingcláusula que também irá liberar e fechar.
Tomas

11
Não esqueça de usar o Dispose;
vitor_gaudencio_oliveira



1

Experimente o BinaryReader:

/// <summary>
/// Convert the Binary AnyFile to Byte[] format
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ConvertANYFileToBytes(HttpPostedFileBase image)
{
    byte[] imageBytes = null;
    BinaryReader reader = new BinaryReader(image.InputStream);
    imageBytes = reader.ReadBytes((int)image.ContentLength);
    return imageBytes;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.