Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203

    [VB.NET] Scrittura / Lettura su file binary

    Ciao a tutti,

    devo scrivere un piccolo programma che mi cataloghi delle password di vari applicativi

    nel form ho inserito 2 textbox (1 per la username e 1 per la password)
    e un combobox che dovrà tenere la lista dei vari applicativi, una volta selezionato l'applicativo
    dalla lista caricherà dal file le info riguardanti username e password che saranno visualizzati nelle textbox.


    ora sorge il problema, ho creato la struttura

    <Serializable()> Structure PWD

    Dim Programma As String
    Dim Username As String
    Dim Password As String

    End Structure

    e risco a scrivere sul file però una volta che ho scritto i primi dati
    se ne inserivsco altri, mi vanno a sovrascrivere i precedenti, in pratica i dati non vengono accodati al file.

    per scrivere sul file ho usato il seguente codice:

    Dim ListPWD As PWD


    ListPWD.Programma = TextBox1.Text
    ListPWD.Username = TextBox2.Text
    ListPWD.Password = TextBox3.Text

    Dim BF As New System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter()

    Dim MS As New System.IO.MemoryStream()

    BF.Serialize(MS, ListPWD)

    My.Computer.FileSystem.WriteAllBytes(Application.S tartupPath & "\prova.bin", MS.GetBuffer(), False)



    P.S. per il momento sto facendo la prova senza combobox ma con una textbox al suo posto.



    ho un'altro dubbio, una volta creato correttamente il file, come faccio a fare una ricerca tramite il campo PWD.Programma ?

    Grazie a tutti anticipatamente

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    allora, diciamo che apparentemente ho risolto la sovrascrittura del file

    modificando

    My.Computer.FileSystem.WriteAllBytes(Application.S tartupPath & "\prova.bin", MS.GetBuffer(), False)

    in

    My.Computer.FileSystem.WriteAllBytes(Application.S tartupPath & "\prova.bin", MS.GetBuffer(), True)

    in modo da abilitare l'Appending del file

    adesso i dati vengono accodati

    ma non so come fare in fase di lettura ad effettuare la ricerca per PWD.Programma come scritto su.

    Consigli ?

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Diciamo che stai sbagliando il metodo.
    Il mio consiglio è quello si di creare una struttura come hai fatto, popolare un'arrayList con la/le strutture create e serializzare il tutto. In questo modo non hai il problema dell'accodamento del file e non hai il problema di recuperare le password quando deserializzi.

    Quindi:

    codice:
     Dim myList As New ArrayList
    
        <Serializable()> _
        Structure PWD
            Dim Programma As String
            Dim Username As String
            Dim Password As String
    
            Sub New(ByVal programma As String, ByVal username As String, ByVal password As String)
                Me.Programma = programma
                Me.Password = password
                Me.Username = username
            End Sub
        End Structure
    
        Sub AddItem()
            Dim myPWD As New PWD("mioProgramma", "MioUsername", "miaPassword")
            myList.Add(myPWD)
            myPWD = New PWD("mioProgramma2", "MioUsername2", "miaPassword2")
            myList.Add(myPWD)
            myList.TrimToSize()
            Dim stream As FileStream = File.Open("C:\mioFile.bin", FileMode.Create)
            Dim formatter As New BinaryFormatter()
            formatter.Serialize(stream, myList)
            stream.Close()
        End Sub

    Quando recuperi:

    è
    codice:
       Sub Deserialize()
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open("C:\mioFile.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(Stream)
            stream.Close()
        End Sub

    Scusa per la frettolosità del codice.
    Sbagliare è umano, perseverare è diabolico.

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Hai aperto il tuo file bin? Non credo...
    A parte il fatto che vengono incluse informazioni inerenti al progetto sorgente (e ripetute per ogni aggiunta, e che non servono a niente) le informazioni sono scritte 'in chiaro' .
    Io preferisco usare una Hashtable ed un FileStream (al posto del MemoryStream), come indicato qui:

    http://msdn.microsoft.com/it-it/libr...inaryformatter(VS.80).aspx?ppud=4


    Comunque sarebbe più corretto usare la crittografia, visto il tipo di informazioni che registri:
    http://www.devx.com/codemag/Article/16747


  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    Originariamente inviato da Pirelli72
    Diciamo che stai sbagliando il metodo.
    Il mio consiglio è quello si di creare una struttura come hai fatto, popolare un'arrayList con la/le strutture create e serializzare il tutto. In questo modo non hai il problema dell'accodamento del file e non hai il problema di recuperare le password quando deserializzi.

    Quindi:

    codice:
     Dim myList As New ArrayList
    
        <Serializable()> _
        Structure PWD
            Dim Programma As String
            Dim Username As String
            Dim Password As String
    
            Sub New(ByVal programma As String, ByVal username As String, ByVal password As String)
                Me.Programma = programma
                Me.Password = password
                Me.Username = username
            End Sub
        End Structure
    
        Sub AddItem()
            Dim myPWD As New PWD("mioProgramma", "MioUsername", "miaPassword")
            myList.Add(myPWD)
            myPWD = New PWD("mioProgramma2", "MioUsername2", "miaPassword2")
            myList.Add(myPWD)
            myList.TrimToSize()
            Dim stream As FileStream = File.Open("C:\mioFile.bin", FileMode.Create)
            Dim formatter As New BinaryFormatter()
            formatter.Serialize(stream, myList)
            stream.Close()
        End Sub

    Quando recuperi:

    è
    codice:
       Sub Deserialize()
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open("C:\mioFile.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(Stream)
            stream.Close()
        End Sub

    Scusa per la frettolosità del codice.
    grazie mille per l'esempio

    solo che non ho capito una cosa sul "recupero"

    ok apro il file, deserializzo con il codice che mi hai scritto...e poi?

    come effettuo la ricerca su uno dei campi ?

    scusa ma ho appena messo mani sul vb.net


    Originariamente inviato da gibra
    Hai aperto il tuo file bin? Non credo...
    A parte il fatto che vengono incluse informazioni inerenti al progetto sorgente (e ripetute per ogni aggiunta, e che non servono a niente) le informazioni sono scritte 'in chiaro' .
    Io preferisco usare una Hashtable ed un FileStream (al posto del MemoryStream), come indicato qui:

    http://msdn.microsoft.com/it-it/libr...inaryformatter(VS.80).aspx?ppud=4


    Comunque sarebbe più corretto usare la crittografia, visto il tipo di informazioni che registri:
    http://www.devx.com/codemag/Article/16747

    grazie mille anche a te

    ottimo il suggerimento sulla critto, prima xò credo che debba imparare a farlo in chiato e appena ci risco lo faccio con la crittografia che è molto importante!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    come effettuo la ricerca su uno dei campi ?
    Hai in mano un'arrayList popolato con le tue strutture, quindi se devi trovare la password per un programma non puoi fare altro che usare un ciclo For..next, esempio:

    codice:
     Function Find(ByVal programma As String, ByVal lista As ArrayList) As PWD
            Dim mystruc As PWD
           For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then Return mystruc
            Next
        End Function
    in questo modo hai la struttura con il nome del programma chiamato:

    codice:
    Dim mystruc As PWD = Find("mioProgramma2", lista)

    Il problema della sicurezza rimane comunque anche nel caso che ti ho proposto, bisogna dire che le password e le Username NON sono in chiaro ma il problema rimane, se prende in mano il file qualcuno che capisce qualcosa di programmazione (e di serializzazione degli oggetti), capisce subito che si tratta di una serializzazione di un'Arralist e a quel punto potrebbe deserializzare e ricavarne le strutture.
    Sbagliare è umano, perseverare è diabolico.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    Originariamente inviato da Pirelli72
    Hai in mano un'arrayList popolato con le tue strutture, quindi se devi trovare la password per un programma non puoi fare altro che usare un ciclo For..next, esempio:




    Il problema della sicurezza rimane comunque anche nel caso che ti ho proposto, bisogna dire che le password e le Username NON sono in chiaro ma il problema rimane, se prende in mano il file qualcuno che capisce qualcosa di programmazione (e di serializzazione degli oggetti), capisce subito che si tratta di una serializzazione di un'Arralist e a quel punto potrebbe deserializzare e ricavarne le strutture.

    Grandioso grazie mille

    ora mi manca solo l'ultimo pezzo!!

    dopo aver effettuato la ricerca dovrei poter modificare e salvare
    e dopo aver ricercato dovrei poter eliminare il "programma" quindi tutto ciò che è a lui associato (username e pwd)

    come faccio?

    ti posto il codice che ho adattato:


    codice:
    Imports System.IO
    Imports System.Collections
    Imports System.Runtime.Serialization.Formatters.Binary
    Imports System.Runtime.Serialization
    
    Public Class Form1
    
    
        Dim myList As New ArrayList
    
        <Serializable()> _
        Structure PWD
            Dim Programma As String
            Dim Username As String
            Dim Password As String
            Dim Note As String
    
    
            Sub New(ByVal programma As String, ByVal username As String, ByVal password As String, ByVal note As String)
                Me.Programma = programma
                Me.Password = password
                Me.Username = username
                Me.Note = note
            End Sub
        End Structure
    
    
        Sub AddItem()
    
            Dim myPWD As New PWD(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text)
            myList.Add(myPWD)
            myPWD = New PWD(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text)
            myList.Add(myPWD)
            myList.TrimToSize()
            Dim stream As FileStream = File.Open(Application.StartupPath & "\prova.bin", FileMode.Create)
            Dim formatter As New BinaryFormatter()
            formatter.Serialize(stream, myList)
            stream.Close()
    
        End Sub
    
        Sub Deserialize()
    
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open(Application.StartupPath & "\prova.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(stream)
            Dim mystruc As PWD = Find(ComboBox1.Text, lista)
    
            TextBox1.Text = mystruc.Programma
            TextBox2.Text = mystruc.Username
            TextBox3.Text = mystruc.Password
            TextBox4.Text = mystruc.Note
    
            stream.Close()
    
        End Sub
    
        Function Find(ByVal programma As String, ByVal lista As ArrayList) As PWD
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
    
                If ComboBox1.Items.Contains(mystruc.Programma) = False Then ComboBox1.Items.Add(mystruc.Programma)
    
                If mystruc.Programma = programma Then Return mystruc
    
            Next
        End Function
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
            Deserialize()
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            AddItem()
    
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            ComboBox1.Items.Add(" ")
            Call Button2_Click(sender, e)
    
        End Sub
    End Class



    Grazie ancora

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    dopo aver effettuato la ricerca dovrei poter modificare e salvare
    e dopo aver ricercato dovrei poter eliminare il "programma" quindi tutto ciò che è a lui associato (username e pwd)
    Per Eliminare una struttura nell'ArrList:

    codice:
     Sub RemoveIndex(ByVal programma As String, ByVal lista As ArrayList)
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Exit For
                End If
            Next
        End Sub
    Per cambiare una struttura:

    codice:
    Sub ChangeIndex(ByVal programma As String, ByVal lista As ArrayList, ByVal password As String, ByVal userName As String, Optional ByVal note As String = "")
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Dim myPWD As New PWD(programma, userName, password, note)
                    myList.Add(myPWD)
                    Exit For
                End If
            Next
        End Sub

    Ovviamente da personalizzare.

    Sbagliare è umano, perseverare è diabolico.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    ho qualche problema

    non mi risulta.....

    non so dove sbaglio

    ho fatto così

    codice:
      Function RemoveIndex(ByVal programma As String, ByVal lista As ArrayList) As PWD
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Exit For
                End If
            Next
        End Function
    
        Sub Remove()
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open(Application.StartupPath & "\prova.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(stream)
            Dim mystruc As PWD = RemoveIndex(ComboBox1.Text, lista)
    
            'TextBox1.Text = mystruc.Programma
            'TextBox2.Text = mystruc.Username
            'TextBox3.Text = mystruc.Password
            'TextBox4.Text = mystruc.Note
    
            stream.Close()
        End Sub

    per la modifica invece:

    codice:
     Sub ChangeIndex(ByVal programma As String, ByVal lista As ArrayList, ByVal password As String, ByVal userName As String, Optional ByVal note As String = "")
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Dim myPWD As New PWD(programma, userName, password, note)
                    myList.Add(myPWD)
                    Exit For
                End If
            Next
        End Sub
        Sub Change()
    
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open(Application.StartupPath & "\prova.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(stream)
            Dim mystruc As PWD = ChangeIndex(TextBox1.Text, lista, TextBox3.Text, TextBox2.Text)
    
    
            stream.Close()
        End Sub
    in quest'ultima parte il debug su questa riga

    Dim mystruc As PWD = ChangeIndex(TextBox1.Text, lista, TextBox3.Text, TextBox2.Text)

    mi dice che non produce nessun valore.


    non riesco a far funzionare la rimozione e la modifica

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da S0nic
    ho qualche problema

    non mi risulta.....

    non so dove sbaglio

    ho fatto così

    codice:
      Function RemoveIndex(ByVal programma As String, ByVal lista As ArrayList) As PWD
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Exit For
                End If
            Next
        End Function
    
        Sub Remove()
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open(Application.StartupPath & "\prova.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(stream)
            Dim mystruc As PWD = RemoveIndex(ComboBox1.Text, lista)
    
            'TextBox1.Text = mystruc.Programma
            'TextBox2.Text = mystruc.Username
            'TextBox3.Text = mystruc.Password
            'TextBox4.Text = mystruc.Note
    
            stream.Close()
        End Sub
    Non capisco perchè tu abbia trasformato le Sub in Function ??

    codice:
      Dim mystruc As PWD = RemoveIndex(ComboBox1.Text, lista)
    Chiaramente non va bene, era corretta la mia Sub:

    codice:
    Sub RemoveIndex(ByVal programma As String, ByVal lista As ArrayList)
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Exit For
                End If
            Next
        End Sub
    e quindi:

    codice:
    Sub Remove()
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open(Application.StartupPath & "\prova.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(stream)
            RemoveIndex(ComboBox1.Text, lista)
    
            stream.Close()
    
            '*********************************
            'Devi serializzare ancora se vuoi salvare su File
            '**********************************
        End Sub

    per la modifica invece questa va bene:

    codice:
     Sub ChangeIndex(ByVal programma As String, ByVal lista As ArrayList, ByVal password As String, ByVal userName As String, Optional ByVal note As String = "")
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Dim myPWD As New PWD(programma, userName, password, note)
                    myList.Add(myPWD)
                    Exit For
                End If
            Next
        End Sub
    Ma ovviamente non puoi assegnare a una struttura il risultato di una Sub? che non ha nessun ritorno!

    codice:
    Dim mystruc As PWD = ChangeIndex(TextBox1.Text, lista, TextBox3.Text, TextBox2.Text)
    Quindi il codice qui sopra non va bene, per cui come avevo scritto la sub era:

    codice:
    Sub ChangeIndex(ByVal programma As String, ByVal lista As ArrayList, ByVal password As String, ByVal userName As String, Optional ByVal note As String = "")
            Dim mystruc As PWD
            For i As Integer = 0 To lista.Count - 1
                mystruc = CType(lista(i), PWD)
                If mystruc.Programma = programma Then
                    lista.RemoveAt(i)
                    Dim myPWD As New PWD(programma, userName, password, note)
                    myList.Add(myPWD)
                    Exit For
                End If
            Next
        End Sub
    e utilizzandola:


    codice:
        Sub Change()
            Dim lista As ArrayList
            Dim stream As FileStream = File.Open(Application.StartupPath & "\prova.bin", FileMode.Open)
            Dim formatter As New BinaryFormatter()
            lista = formatter.Deserialize(stream)
            ChangeIndex(TextBox1.Text, lista, TextBox3.Text, TextBox2.Text)
            stream.Close()
    
    '**************************
    'Devi serializzare per salvare su File
    '**************************
        End Sub
    Quindi in pratica:
    -Deserializzazione dell'ArrayList
    -Modifica o cancellazione di un elemento
    -Serializzazione per salvare-

    Attenzione che non vi è nessun controllo sui dupplicati, per cui se inserisci due programmi con lo stesso nome...sono dolori!!!!
    Sbagliare è umano, perseverare è diabolico.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.