Ir para conteúdo
Fórum Script Brasil
  • 0

Arquivos


Andersonjb

Pergunta

E ai pessoal, alguém poderia me ajudar com manipulação de arquivos? Bem, eu consigo ler os arquivos, so que não consigo ler eles por completo, so le a metade do arquivo e nunca le a primeira letra. Bem, meu codigo e esse:

Imports System.IO
Imports System.Windows.Forms
    Public Class Form1
        Inherits System.Windows.Forms.Form
        Private arquivoentrada As FileStream
        Private binarioentrada As BinaryReader


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 

System.EventArgs) Handles Button1.Click
        Dim abrir As OpenFileDialog = New OpenFileDialog
        Dim resultado As DialogResult = abrir.ShowDialog
        Dim nomearq As String = abrir.FileName
        If resultado = DialogResult.Cancel Then
            Return
        End If
        arquivoentrada = New FileStream(nomearq, FileMode.Open, 

FileAccess.Read)
        binarioentrada = New BinaryReader(arquivoentrada)
        RichTextBox1.Text = binarioentrada.ReadString
    End Sub
End Class

alguém poderia me ajudar???

Link para o comentário
Compartilhar em outros sites

  • Respostas 102
  • Created
  • Última resposta

Top Posters For This Question

Posts Recomendados

  • 0

Olha so , Gray, você falou para mim fazer simplesmente a ordem reversa e eu fiz, so que não funcionou, de uma olhada na minha lógica:

 Dim s As New System.Text.StringBuilder      'Criando a StringBUilder
 s.Append(RichTextBox1.Text)                     'Colocando o Texto na Instancia
 arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)        
 binariosaida = New BinaryWriter(arquivosaida)   'Gravando os Arquivos

Bem, ele ate salva, mas as vezes aparece alguns caracteres estranhos, você pode me dizer o que são esses caracteres? Me desculpa encher o seu saco mais e que nunca mexi com arquivos em vb.net, então me desculpa ai, beleza? Falows!

Link para o comentário
Compartilhar em outros sites

  • 0
Olha so , Gray, você falou para mim fazer simplesmente a ordem reversa e eu fiz, so que não funcionou, de uma olhada na minha lógica:

 Dim s As New System.Text.StringBuilder      'Criando a StringBUilder
 s.Append(RichTextBox1.Text)                     'Colocando o Texto na Instancia
 arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)        
 binariosaida = New BinaryWriter(arquivosaida)   'Gravando os Arquivos

Bem, ele ate salva, mas as vezes aparece alguns caracteres estranhos, você pode me dizer o que são esses caracteres? Me desculpa encher o seu saco mais e que nunca mexi com arquivos em vb.net, então me desculpa ai, beleza? Falows!

Na RichTextBox estão os valores hexadecimais, certo? Então, na verdade o que está lá é um *texto* com os valores hexadecimais dos bytes. Porém, não é isso que queremos gravar no arquivo (não é esse texto). Se eu tenho:

A7 00 3D 5F

Não é isso que eu quero gravar em um arquivo, mas sim os respectivos valores decimais, ou seja, 167, 0, 61 e 95. O que eu tenho que gravar no arquivo é chr(167) & chr(0) & chr(61) & chr(95). Sacou, agora? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

então, Gray, so sei que aqui ta fod.... To tentando há mil anos e não consigo, mas eu vou conseguir. E que assim: eu to extraindo textos de uma rom de super nintendo, e o texto que ta la dentro ta em binario, não e? O que acontece e que se eu salvar em caracter ( chr ), ele vai salvar do mesmo jeito? Olha so o meu codigo para salvar:

        arquivosaida = New FileStream(nomearq, FileMode.Append, FileAccess.Write)
        binariosaida = New BinaryWriter(arquivosaida)
        Dim s As New System.Text.StringBuilder
        s.Append(RichTextBox1.Text)
        binariosaida.Write(Hex(s))
        arquivosaida.Close()
        binariosaida.Close()

crio as instacias para gravar o arquivo, crio a string builder para adicionar o arquivo, escrevo no arquivo em hexa, e isso aqui não salva!!! Aonde e que eu to errando??

Link para o comentário
Compartilhar em outros sites

  • 0
então, Gray, so sei que aqui ta fod.... To tentando há mil anos e não consigo, mas eu vou conseguir. E que assim: eu to extraindo textos de uma rom de super nintendo, e o texto que ta la dentro ta em binario, não e? O que acontece e que se eu salvar em caracter ( chr ), ele vai salvar do mesmo jeito? Olha so o meu codigo para salvar:

        arquivosaida = New FileStream(nomearq, FileMode.Append, FileAccess.Write)
        binariosaida = New BinaryWriter(arquivosaida)
        Dim s As New System.Text.StringBuilder
        s.Append(RichTextBox1.Text)
        binariosaida.Write(Hex(s))
        arquivosaida.Close()
        binariosaida.Close()
crio as instacias para gravar o arquivo, crio a string builder para adicionar o arquivo, escrevo no arquivo em hexa, e isso aqui não salva!!! Aonde e que eu to errando??
Acho que você ainda não pegou o espírito da coisa: *tudo* é gravado em binário. Se dentro do arquivo existir a palavra "TESTE", mesmo em binário, você verá "TESTE" lá. O texto *não* é codificado de forma diferente pelo fato de estar em binário. O nome "binário" não quer dizer que o arquivo seja armazenado em sequências de 0 e 1s (diretamente). Imagine um byte, cujo valor é: 1000001 (sete algarismos). Para gravá-lo em um arquivo, não seria melhor diminuir "esteticamente" esse valor? Afinal de contas, ele tem 7 algarismos. Ah, então podemos utilizar sua versão decimal que é 65 (apenas dois algarismos). Mas, não teria como diminuir? Sim, utilizando o caracter correspondente, no caso, o "A" (apenas *um* caracter). Com um byte (11111111) você tem como formar 256 valores decimais e você também tem 256 caracteres na tabela ASCII/ANSI. Então, na verdade um arquivo "binário" é constituído por uma série de caracteres, cujos valores dos caracteres existentes nele é que importam. O exemplo abaixo comprova isso:
        Dim f As New IO.FileStream("c:\teste.bin", IO.FileMode.Create)
        Dim saída As New IO.BinaryWriter(f)
        saída.Write(65)
        saída.Close()

Veja que mandei gravar o valor 65 no arquivo binário. Abra o arquivo em um editor de textos qualquer e você verá o caracter "A" lá.

Em suma, se você tem os valores em hexa na RichTextBox, você vai precisar convertê-los para decimal e depois mandar gravar esse decimal no arquivo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Gray, consegui! Depois de encontaveis enchidas de saco, rs, finalmente consegui salvar os dados. O Codigo que eu usei foi esse:

        Try
            arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
            binariosaida = New BinaryWriter(arquivosaida)
            binariosaida.Write(RichTextBox1.Text)
            arquivosaida.Close()
            binariosaida.Close()
        Catch ex As Exception
            MsgBox("não salvou")
        End Try
Bem, so que eu so queria tirar mais uma duvidazinha, posso? E que e assim: apesar dele salvar no arquivo, e eu estar salvando como caracter, aparece uns simbolos entranhos, mais ou menos assim: digamos que eu abra um arquivo com esse texto:
haha hehe hihi hoho huhu
POr causa do COdigo que eu coloquei, ele abriria no meu editor da seguinte maneira:
hahe..hehe..hihi ..hoho..huhu
Mas quando eu vou salvar o arquivo, ele fica da seguinte maneira:
.hahe..hehe..hih i...hoho..huhu
Bem, veja ai que ele adicionou um ponto logo no inicio, o que seria esse ponto?? ( que no caso e uma determinação minha para um caracter que não tem uma representação grafica valida ) Eu cheguei ate a pensar que seria o marcador do começo da string, sera que e isso? E bem, o arquivo teria que ser salvo da seguinte maneira:
haha hehe hihi hoho huhu
Mas não, ele e salvo dessa maneira:
hahe..hehe..hihi...hoho..huhu
Bem, ele não deveria alterar somente as letras, porque altera tudo? Sera que e por causa disso?
binariosaida.Write(RichTextBox1.Text)

Se for, como faço pra salvar somente as modificações??

Link para o comentário
Compartilhar em outros sites

  • 0

Se você determinou que o ponto (".") deve substituir os caracteres sem representação gráfica, então você *não* vai ter mais esses caracteres e sim o ponto... Como o programa vai distinguir um ponto do outro? Se antes eu tinha chr(13) + chr(10) e isso virou "..", como vou saber que o primeiro ponto é chr(13) e que o segundo é chr(10), se ambos são pontos? Esse é que o problema aí no caso. Se você estivesse utilizando a representação hexadecimal, então você teria (no caso do chr(13) + chr(10)) "0D 0A" e quando fosse gravar no arquivo você converteria o 0D para 13 e o 0A para 10 e a gravação resultante estaria correta. Sacou? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, gray,olha so: no caso pra mim achar os caracteres eu teria que converte-los em binario, correto? porque eu preciso fazer uma varredura no arquivo pra ver aonde eu tenho qu epular linha, etc... POr exeplo, eu poderia usar um for each pra mim ver todas as letras e colocar um if pra mim definir o que e o que na hora de eu gravar o arquivo, correto? So que o problema e que eu não estou conseguindo converter o conteudo da RichTextBox em bytes, par amim executar o for each. Nem com o binary writer que eu criei não tem a propriedade lenght pra mim pegar o tanto de caracteres que tem e eu executar o for each. Da uma olhada:

        Try
            arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
            binariosaida = New BinaryWriter(arquivosaida)
            Dim s As New System.Text.StringBuilder
            s.Append(RichTextBox1.Text)
            Dim bytes() As Byte = binariosaida.BaseStream.ReadByte(arquivosaida.Length)
            Dim a As String
            Dim bytes() As Byte
            binariosaida.Write(RichTextBox1.Text)
            arquivosaida.Close()
            binariosaida.Close()
        Catch ex As Exception
            MsgBox("não salvou")
        End Try

Esse base stream ai ta com erro... então como eu faço para mim converter os caracteres da richtextbox em bytes pra mim ver o conteudo e colocar os pula linhas, etc???

Link para o comentário
Compartilhar em outros sites

  • 0
Bem, gray,olha so: no caso pra mim achar os caracteres eu teria que converte-los em binario, correto? porque eu preciso fazer uma varredura no arquivo pra ver aonde eu tenho qu epular linha, etc... POr exeplo, eu poderia usar um for each pra mim ver todas as letras e colocar um if pra mim definir o que e o que na hora de eu gravar o arquivo, correto? So que o problema e que eu não estou conseguindo converter o conteudo da RichTextBox em bytes, par amim executar o for each. Nem com o binary writer que eu criei não tem a propriedade lenght pra mim pegar o tanto de caracteres que tem e eu executar o for each. Da uma olhada:

        Try
            arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
            binariosaida = New BinaryWriter(arquivosaida)
            Dim s As New System.Text.StringBuilder
            s.Append(RichTextBox1.Text)
            Dim bytes() As Byte = binariosaida.BaseStream.ReadByte(arquivosaida.Length)
            Dim a As String
            Dim bytes() As Byte
            binariosaida.Write(RichTextBox1.Text)
            arquivosaida.Close()
            binariosaida.Close()
        Catch ex As Exception
            MsgBox("não salvou")
        End Try

Esse base stream ai ta com erro... então como eu faço para mim converter os caracteres da richtextbox em bytes pra mim ver o conteudo e colocar os pula linhas, etc???

Você não precisa "procurar" o que deve substituir. Basta apenas gravar o arquivo todo novamente. Um arquivo .DOC (do Word) é binário (se você abrí-lo em um editor de textos comum você pode comprovar isso). Se você abrir um documento no Word só para consertar uma vírgula que está fora do lugar e salvá-lo novamente, sabe o que acontece? O Word *não* sai percorrendo o arquivo gravado e comparando com o alterado para saber o que o mudou. Ele simplesmente pega o alterado *todo* e grava por cima (sobrescreve) do arquivo antigo. Por isso que eu te sugeri converter todo o conteúdo da RichTextBox (que está em hexa, não?) para bytes e gravar no arquivo. Dê uma lida novamente no meu post anterior a esse agora.

Sacou? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

E ai Gray, me desculpa novamente te incomodar ai, mas eu to apanhando que nem um condenado nesse negocio aqui... Bem, eu segui a sua ideia, e claro que não por ser certa, de como eu posso dizer, "restransformar" os caracteres do arquivo, por exemplo, eu usei a função Chr() para passar os dados do arquivo para caracter e para salvar eu estou passando os caracteres para a sua menção original, que no caso seria o codigo Ascii, utilizando essa função que você me recomendou. Bem, o codigo de salvar ficou assim:

          arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
            binariosaida = New BinaryWriter(arquivosaida)

            binariosaida.Write(Asc(RichTextBox1.Text))
            arquivosaida.Close()
            binariosaida.Close()
Bem, acontece que ele não salva corretamente. Ai eu estive pensando ( novamente, o bicho burro ) e quando eu abro o arquivo eu utilizo o for each e ranformo caracter por caracter, não e verdade, e o arquivo abre perfeitamente.Ai eu pensei, então porque não fazer o mesmo na hora de salvar? So que o problema e que eu não consigo ler a quantidade de bytes que tem ou no binary reader ou no filestream que me possibilitam executar o for each, por exemplo: eu preciso pegar a quantidade de bytes contida no arquivo, certo, para mim executar o for e converter ate o ultimo bit ( caracter ) de informação para mim salvar no arquivo, correto? So que o problema e como eu disse, não há nemhum metodo ReadBytes nessa instancias para mim verificar o tamanho e eu executar o for each, o mais perto que eu consigui achar foi isso:
        Dim bytes() As Byte = binariosaida.BaseStream.ReadByte(arquivosaida.lenght)

Link para o comentário
Compartilhar em outros sites

  • 0

Veja bem: o conteúdo todo do arquivo não está na RichTextBox? Você não quer salvar *justamente* o que está na RichTextBox? Então você precisa do tamanho dos dados que estão *na* RichTextBox, não?

Mas, você ainda não me disse como está representando os dados nela (se é em hexadecimal, decimal, octal, etc.). Seja lá o que for, você *não* vai poder fazer simplesmente...

binariosaida.Write(Asc(RichTextBox1.Text))

... até porque Asc() só converte *um* caracter (se forem caracteres ASCII que estiverem sendo exibidos lá, é claro). Sacou? wink.gif

Dê uma olhada novamente nestes posts:

http://scriptbrasil.com.br/forum/index.php...ic=67058&st=15#

http://scriptbrasil.com.br/forum/index.php...ic=67058&st=30#

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Bem, os dados estão representados em letras normais

Em uma RichTextBox? Um arquivo binário? Não tem como você estar mostrando um arquivo binário na RichTextBox com caracteres normais. O primeiro byte 0 que aparecer no arquivo vai finalizar o texto na RichTextBox. É isso que eu venho te falando desde o começo. Se você estiver fazendo testes com arquivos simples, que não possuem bytes sem representação gráfica, vai dar certo, porém experimente abrir um arquivo executável ou um documento do Word e você vai ver que só o começo do arquivo é que vai aparecer (se aparecer alguma coisa).

Dê uma lida novamente no começo deste tópico.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

hummm, eu lembro que você falou que uma RichTextBox não era o objeto mais apropriado para se fazer isso, mas bem, qaul objeto posso utilizar alem do rich text para abrir e salvar arquivos binários? E acontecia isso mesmo que você falou, por exemplo, antes ate aparecia das letras as roms de super nintendo que eu tentava abrir, mas ultimamente so aparece uma letra. Mas resumindo, que objeto eu devo usar então?

Link para o comentário
Compartilhar em outros sites

  • 0
hummm, eu lembro que você falou que uma RichTextBox não era o objeto mais apropriado para se fazer isso, mas bem, qaul objeto posso utilizar alem do rich text para abrir e salvar arquivos binários? E acontecia isso mesmo que você falou, por exemplo, antes ate aparecia das letras as roms de super nintendo que eu tentava abrir, mas ultimamente so aparece uma letra. Mas resumindo, que objeto eu devo usar então?

Não existe um objeto certo para isso, como eu já disse antes. O ideal seria trocar a maneira como o arquivo é exibido. Já que os "caracteres" de certos bytes não podem ser representados, o melhor seria *não* mostrar os caracteres, e sim utilizar os valores decimais, hexadecimais ou octais. Uma idéia legal seria utilizar duas DataGrids para isso, criando um número de colunas fixas. Daí, em uma DataGrid você veria os valores hexadecimais e em outra você veria os caracteres (já que sua intenção é traduzir, você precisa "ler" o texto). Ao trocar um valor hexa na primeira DataGrid automaticamente o caracter correspondente seria trocado na segunda DataGrid, e vice-versa. E, na hora de salvar você iria pegar apenas os dados da primeira DataGrid (os valores hexadecimais) para recompor os bytes e gravar em um arquivo. Essa idéia acabou de me ocorrer e acredito que a DataGrid ofereça uma edição muito melhor do que você teria na RichTextBox.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Poxa, otima ideia. Bem, não sei se você já mexeu em editores hexas, mas essa coisa acontece, você muda um endereço Hexa e o Valor Decimal tambem muda! Tanto que eu estava pensando como resolver esse problema depois, mas com essa sua solução, e otimo! Bem, interligar as duas data grids e facil, se eu não me engano eu ainda sei como fazer! E para exibir as letras, ou seja, abrir o arquivo binario, e da mesma maneira que você mencionou nesse tópico ou eu tenho de fazer de maneira diferente??

Link para o comentário
Compartilhar em outros sites

  • 0
Poxa, otima ideia. Bem, não sei se você já mexeu em editores hexas, mas essa coisa acontece, você muda um endereço Hexa e o Valor Decimal tambem muda! Tanto que eu estava pensando como resolver esse problema depois, mas com essa sua solução, e otimo! Bem, interligar as duas data grids e facil, se eu não me engano eu ainda sei como fazer! E para exibir as letras, ou seja, abrir o arquivo binario, e da mesma maneira que você mencionou nesse tópico ou eu tenho de fazer de maneira diferente??

Para exibir vai ser um pouco diferente. A DataGrid aceita como fontes de dados um DataSet, ou um DataTable, ou um Array, ou qualquer objeto que implemente a interface IList (uma ArrayList, por exemplo). Eu acho que o jeito mais prático seria criar uma DataTable com dez colunas e preenchê-la. Coloque duas DataGrids no form e chame uma de dgHexa e outra de dgChar, depois coloque o seguinte código após a leitura do arquivo (bytes = binarioentrada.ReadBytes(arquivoentrada.Length)):

        Dim dtHexa As New DataTable
        Dim dtChar As New DataTable

        For i As Integer = 0 To 9
            dtHexa.Columns.Add("c" & i.ToString(), GetType(String))
            dtChar.Columns.Add("c" & i.ToString(), GetType(String))
        Next

        For i As Integer = 0 To (bytes.Length - 10) Step 10
            Dim elementos() As Object = {bytes(i), bytes(i + 1), bytes(i + 2), bytes(i + 3), bytes(i + 4), bytes(i + 5), bytes(i + 6), bytes(i + 7), bytes(i + 8), bytes(i + 9)}

            Dim aH As New ArrayList
            Dim aC As New ArrayList
            Dim elemento As String

            For Each elemento In elementos
                aH.Add(Hex(elemento).PadLeft(2, "0"))
                aC.Add(Chr(elemento))
            Next

            dtHexa.Rows.Add(aH.ToArray(Type.GetType("System.Object")))
            dtChar.Rows.Add(aC.ToArray(Type.GetType("System.Object")))
        Next
        dgHexa.Font = New Font("Courier New", 9)
        dgHexa.PreferredColumnWidth = 20
        dgHexa.DataSource = dtHexa

        dgChar.Font = New Font("Courier New", 9)
        dgChar.PreferredColumnWidth = 20
        dgChar.DataSource = dtChar

Com isso você vai exibir os dados nas duas DataGrids.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, essa obtenção dos valores Hexas eu guardo aonde, em uma String Builder, ou pode ser uma variavel normal? E você falou sobre ir gravando aos poucos.. eu tenho que dar um binary writer a cada caracter contido no arquivo ou posso alvar tudo de uma vez??

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, essa obtenção dos valores Hexas eu guardo aonde, em uma String Builder, ou pode ser uma variavel normal?

Pode ser uma variável normal (dê uma olhada na resposta abaixo).

E você falou sobre ir gravando aos poucos.. eu tenho que dar um binary writer a cada caracter contido no arquivo ou posso alvar tudo de uma vez??

Não, eu disse para você chamar o método Write() do BinaryWriter para cada byte.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

E ai, Gray, to montando a logica como você falou, o problema e o seguinte: como faço para pegar caracter por caracter da data table, qual e o metodo que faz isso? A minha logica e essa: multiplicando as colunas e as linhas eu tenho o numero total de caracteres, não tenho? Assim eu giro um laço for e dentro dele eu vou adicionando os caracteres tranformados dentro da variavel e gravando. Bem, o codigo e esse ai embaixo, mas a duvida continua a mesma, como faço para pegar caracter por caracter da data table?

        Try
            arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
            binariosaida = New BinaryWriter(arquivosaida)

            dtHexa = dghexa.DataSource

            Dim tl As Integer = dtHexa.Rows.Count
            Dim tc As Integer = dtHexa.Columns.Count
            Dim a As Integer = tc
            Dim tchars As String = tl * tc
            Dim b As ArrayList

            For tl = 1 To 10
                For tc = 1 To a
                    b.Add(dthexa.)
                Next
            Next

            arquivosaida.Close()
            binariosaida.Close()
        Catch ex As Exception
            MsgBox("não salvou")
        End Try

Link para o comentário
Compartilhar em outros sites

  • 0

Aí vai um exemplo de como percorrer a DataGrid obtendo seus itens:

        Dim dt As DataTable = dgHexa.DataSource
        For Each linha As DataRow In dt.Rows
            For Each coluna As DataColumn In dt.Columns
                Debug.WriteLine(linha(coluna))
            Next
        Next

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.




  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...