Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Tem como ler (BinaryReader) arquivo binário sem saber qual o tipo de dados deve ser invocado?

Olá,

Durante os execícios da aula 4 CSharp 9, fiquei com a curiosidade de saber se eu conseguiria ler o mesmo arquivo que escrevi, com a hipótese de eu não saber o tipo de dados que gravei.  Tentei utilizando o GetType()  mas sem sucesso! 

Existe como realizar a leitura do mesmo arquivo que acabei de criar descobrindo automaticamente o tipo?

Abaixo o código do exercício a parte que da exceção é o "var leitura = leitor.Read()"

Obrigado,

            Console.WriteLine("=================== ESCREVENDO EM BINARIO ======================");
            using (var fs = new FileStream("ArquivoBinario.txt", FileMode.Create))
            using (var escritor = new BinaryWriter(fs))
            {
                escritor.Write("string");
                escritor.Write(10);
                var data = new DateTime(1977, 12, 30, 14, 00, 01);
                var dataOADataDouble = data.ToOADate(); //Uma data Data de Automação OLE  igual a do excel
                escritor.Write(dataOADataDouble);                

            }

            Console.WriteLine("=================== LENDO AQUIVO BINARIO ======================");
            using (var fs = new FileStream("ArquivoBinario.txt", FileMode.Open))
            using (var leitor = new BinaryReader(fs))
            {
                Console.WriteLine("Leu uma string do arquivo binário:" + leitor.ReadString());
                Console.WriteLine("Leu um inteiro do arquivo binário:" + leitor.ReadInt32());
                var dataLida = leitor.ReadDouble();
                Console.WriteLine("Leu uma data do arquivo binário:" + dataLida);                
                Console.WriteLine("Leu uma data do arquivo binário e converteu:" + DateTime.FromOADate(dataLida));
            }

            Console.WriteLine("=================== LENDO AQUIVO DESCOBRINDO O TIPO ======================");
            using (var fs = new FileStream("ArquivoBinario.txt", FileMode.Open))
            using (var leitor = new BinaryReader(fs))
            {
                while (leitor.BaseStream.Position != leitor.BaseStream.Length)
                {
                    var leitura = leitor.Read();
                    Console.WriteLine($"Leu e descobriu um> {leitor.GetType()} valor: {leitura}" ) ;
                }
            }
1 resposta
solução!

Opa, Matheus. Tudo bom?

Todo arquivo é uma sequência de bytes e eles podem ser interpretados de várias formas.

Dá uma olhada nesse exemplo:

long numero = 177073639172;

using (var fs = new FileStream("c:/temp/BinaryWriter.txt", FileMode.Create))
using (var writer = new BinaryWriter(fs))
{
    Console.WriteLine($"Escrevendo o número {numero} no arquivo.");
    writer.Write(numero);
}

using (var fs = new FileStream("c:/temp/BinaryWriter.txt", FileMode.Open))
using (var reader = new BinaryReader(fs))
{
    var numeroLido = reader.ReadInt64();
    Console.WriteLine($"Conteúdo do arquivo, como long: {numeroLido}.");
}

using (var fs = new FileStream("c:/temp/BinaryWriter.txt", FileMode.Open))
using (var reader = new BinaryReader(fs))
{
    var texto = reader.ReadString();
    Console.WriteLine($"Conteúdo do arquivo, como string: {texto}.");
}

Se você executar, terá a saída:

Escrevendo o número 177073639172 no arquivo.
Conteúdo do arquivo, como long: 177073639172.
Conteúdo do arquivo, como string: Oi:).

Isso é porque tanto o long com valor 177073639172 quanto a string com valor "Oi:)" são representados pela sequencia de bytes [ 4, 79, 105, 58, 41 ].

O BinaryReader não pode descobrir se a intenção com estes bytes foi representar uma string ou um long, sua aplicação precisa decidir isto.

Sua chamada leitor.Read() faz a leitura de um caractere e retorna seu código ou -1 quando o stream chega ao final. A exceção acontece, porque o Encoding utilizado pelo reader não conseguiu interpretar o final do stream como um caractere.

O GetType é um método que retorna um objeto do tipo Type. A classe Type possui metadados sobre tipos no .NET, como a lista de métodos e propriedades que uma classe possui e você pode acessar em tempo de execução (este tema é mais avançado e falamos disto no curso de Reflection).

O que você acha? Ajudei com a dúvida?

Abs.