Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - BinaryReader/BinaryWriter
Forum - C# / VB.NET - BinaryReader/BinaryWriter

Avatar
balto (Ex-Member)
Rookie


Messaggi: 44
Iscritto: 03/11/2009

Segnala al moderatore
Postato alle 17:34
Giovedì, 07/01/2010
Questo topic è stato chiuso dal moderatore

Ciao ragazzi, ho un problema riguardante le due classi citate nel titolo. Allora: creo un file dati con:
Codice sorgente - presumibilmente C# / VB.NET

  1. FileStream fs = new FileStream(fileName, FileMode.Create);
  2. fs.close();



Dopodichè aggiungo delle stringhe con:
Codice sorgente - presumibilmente C# / VB.NET

  1. FileStream fileStream = new FileStream(fileName, FileMode.Open);
  2. BinaryWriter bw = new BinaryWriter(fileStream);
  3. bw.Write("uno");
  4. bw.Write("due");
  5. bw.Write("tre");
  6. bw.Close();
  7. fileStream.Close();



Poi leggo le stringhe del file con:
Codice sorgente - presumibilmente C# / VB.NET

  1. FileStream fileStream = new FileStream(fileName, FileMode.Open);
  2. BinaryReader br = new BinaryReader(fileStream);
  3. while (br.PeekChar() != -1)
  4. {
  5. Console.WriteLine(br.ReadString());
  6. }



E fin qui tutto normale. Ma se nella parte di codice contenente il BinaryWriter scrivo questo:
Codice sorgente - presumibilmente C# / VB.NET

  1. FileStream fileStream = new FileStream(fileName, FileMode.Open);
  2. BinaryWriter bw = new BinaryWriter(fileStream);
  3. bw.Seek(0, Begin); // non ricordo il nome dell'enumeratore
  4. bw.Write("uno");
  5. bw.Write("due");
  6. bw.Write("tre");
  7. bw.Close();
  8. fileStream.Close();



e provo a leggere con il BinaryReader, mi trova un EndOfStreamException, dicendomi che non è possibile leggere oltre la fine del flusso. Ma scusate, se il metodo PeekChar guarda il prossimo carattere e restituisce -1 solo quando giunti alla fine, come è possibile superare il limite del flusso?
Come potrei risolvere il problema?

PS. Qualcuno per caso sa come modificare o eliminare una stringa contenuta all'interno di un file? (Penso si debba usare sempre il BinaryWriter)

Ultima modifica effettuata da balto il 07/01/2010 alle 17:37
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:42
Giovedì, 07/01/2010
All'apertura del file, il cursore è posizionato automaicamente all'inizio, quindi l'istruzione Seek è superflua.
Ma io non ho capito bene quando usi BinaryReader, perchè nel tuo codice c'è solo BinaryWriter. Ossia tutti i codici che hai postato sono del tipo apro-leggo-chiudo o apro-scrivo-chiudo. L'eccezione, invece, mi fa pensare che tu abbian letto dopo una scrittura o prima di essa o qualcosa del genere. Il codice preciso qual è?

P.S.: BinaryWriter e BinaryReader servono per la scrittura binaria, ma se devi usare solo stringhe sono totalmente inutili e poco maneggevoli, a favore dei migliori StreamWriter e StreamReader pensati per la manipolazione di file testuali.

PM
Avatar
balto (Ex-Member)
Rookie


Messaggi: 44
Iscritto: 03/11/2009

Segnala al moderatore
Postato alle 18:02
Giovedì, 07/01/2010
Ok per quanto riguarda il post scriptum, non utilizzo StreamReader/Writer perchè il file da analizzare non è un file testuale, bensì un file con estensione ".dat". O mi sto sbagliando? Cioè, posso usare StreamReader/Writer anche con i file dati?

In ogni caso, ho scritto quelle parti di codice perchè sostanzialmente proprio così sono all'interno del programma. Nel senso, clicco il bottone Aggiungi e chiamo il metodo del BinaryWriter, oppure al load del form richiamo il metodo contenente il BinaryReader per visualizzare tutte le stringhe nel file.
Quella riga di codice(bw.Seek) l'ho scritta perchè cercavo di capire come modificare stringhe, magari scrivendo con uno binarywriter in una posizione che definivo io(appunto la posizione 0), però era più che altro una prova.

Poi non so neppure come modificare o eliminare stringhe dal file...aspetto risposte e grazie per l'interessamento Totem.
Ciao =)

PM
Avatar
balto (Ex-Member)
Rookie


Messaggi: 44
Iscritto: 03/11/2009

Segnala al moderatore
Postato alle 16:54
Venerdì, 08/01/2010
Ragazzi per favore rispondetemi. Totem, come mi hai fatto notare tu, è meglio utlizzare le classi StreamReader e StreamWriter. Quindi con una leggerò e con una scriverò. Ma se io voglia modificare una scritta all'interno del file ad una determinata posizione o voglia eliminarla, devo sempre usare queste due classi? Come potrei fare? Per favore rispondetemi, che non so proprio come fare :s

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 13:56
Sabato, 09/01/2010
Non continuare a postare. Quando qualcuno vorrà risponderti, lo farà.

L'estensione del file non è limitativa e, anzi, potrebbe anche non esistere. Serve solo per far capire all'elaboratore "come" intepretare ciò che c'è scritto nel file, ma si tratta sempre di dati. Detto questo, puoi aprire un file come più ti aggrada senza rispettarne il formato.

Per modificare, il supporto file non è il più adatto. Dovresti prima trasferire il tutto in una stringa o in un altro oggetto di facile manipolazione, quindi cambiare quel che devi e poi risalvarlo nel file.

PM
Avatar
balto (Ex-Member)
Rookie


Messaggi: 44
Iscritto: 03/11/2009

Segnala al moderatore
Postato alle 14:05
Sabato, 09/01/2010
Mi scuso per i ripetuti post.
Comunque si Totem, ho fatto come mi hai suggerito e adesso riesco con facilità a scrivere, leggere, modificare e rimuovere stringhe da un file.
Adesso però sorge un altro problema. Dato che vorrei criptare queste stringhe(credo con l'algoritmo DES) e poi inserirle nel file, dovrei inserire degli array di byte (e qui sarei costretto ad utilizzare il BinaryWriter). E fino a qui non è un problema perchè userei il metodo Write. Ma sto cercando in ogni modo di leggere questi bytes dal file tramite uno BinaryReader con il metodo ReadBytes ma non riesco ad ottenere nulla. Infatti se passo questi array di bytes al metodo Decrypt per decriptare, mi dice che i dati non sono validi. Posoto il codice così è tutto più chiaro.

Codice sorgente - presumibilmente C++

  1. class DESAlgorithm
  2.     {
  3.         public static byte[] Encrypt(string text, SymmetricAlgorithm key)
  4.         {
  5.             MemoryStream memStream = new MemoryStream();
  6.             CryptoStream encStream = new CryptoStream(memStream, key.CreateEncryptor(), CryptoStreamMode.Write);
  7.             StreamWriter strWriter = new StreamWriter(encStream);
  8.             strWriter.WriteLine(text);
  9.             strWriter.Close();
  10.             encStream.Close();
  11.             byte[] buffer = memStream.ToArray();
  12.             memStream.Close();
  13.             return buffer;
  14.         }
  15.  
  16.         public static string Decrypt(byte[] CypherText, SymmetricAlgorithm key)
  17.         {
  18.             MemoryStream memStream = new MemoryStream(CypherText);
  19.             CryptoStream encStream = new CryptoStream(memStream, key.CreateDecryptor(), CryptoStreamMode.Read);
  20.             StreamReader strReader = new StreamReader(encStream);
  21.             string text = strReader.ReadLine();
  22.             strReader.Close();
  23.             encStream.Close();
  24.             memStream.Close();
  25.             return text;
  26.         }
  27.     }



Codice sorgente - presumibilmente VB.NET

  1. class StreamManager
  2.     {
  3.         private static string fileName;
  4.  
  5.         public static string fName
  6.         {
  7.             get { return fileName; }
  8.             set { fileName = value; }
  9.         }
  10.  
  11.         private StreamManager()
  12.         {
  13.         }
  14.  
  15.         public static void AddData(string username, string password, string informations)
  16.         {
  17.             FileStream fileStream = new FileStream(fName, FileMode.Append);
  18.             StreamWriter strWriter = new StreamWriter(fileStream);
  19.             strWriter.WriteLine(username);
  20.             strWriter.WriteLine(password);
  21.             strWriter.WriteLine(informations);
  22.             strWriter.Close();
  23.             fileStream.Close();
  24.         }
  25.  
  26.         public static void RemoveData(int index)
  27.         {
  28.             int newIndex = index * 3;
  29.            
  30.             List<string> fileList = new List<string>();
  31.             fileList = StreamManager.ReadData();
  32.             fileList.RemoveAt((newIndex + 2));
  33.             fileList.RemoveAt((newIndex + 1));
  34.             fileList.RemoveAt(newIndex);
  35.  
  36.             FileStream fileStream = new FileStream(fName, FileMode.Truncate);
  37.             StreamWriter strWriter = new StreamWriter(fileStream);
  38.             foreach (string strData in fileList)
  39.             {
  40.                 strWriter.WriteLine(strData);
  41.             }
  42.             strWriter.Close();
  43.             fileStream.Close();
  44.         }
  45.  
  46.         public static void EditData(int index, string username, string password, string informations)
  47.         {
  48.             string newUsername = username;
  49.             string newPassword = password;
  50.             string newInformations = informations;
  51.             int newIndex = index * 3;
  52.            
  53.             List<string> fileList = new List<string>();
  54.             fileList = StreamManager.ReadData();
  55.             fileList[newIndex] = fileList[newIndex].Replace(fileList[newIndex], newUsername);
  56.             fileList[(newIndex + 1)] = fileList[(newIndex + 1)].Replace(fileList[(newIndex + 1)], newPassword);
  57.             fileList[(newIndex + 2)] = fileList[(newIndex + 2)].Replace(fileList[(newIndex + 2)], newInformations);
  58.  
  59.             FileStream fileStream = new FileStream(fName, FileMode.Truncate);
  60.             StreamWriter strWriter = new StreamWriter(fileStream);
  61.             foreach (string strData in fileList)
  62.             {
  63.                 strWriter.WriteLine(strData);
  64.             }
  65.             strWriter.Close();
  66.             fileStream.Close();
  67.         }
  68.  
  69.         public static List<string> ReadData()
  70.         {
  71.             List<string> fileList = new List<string>();
  72.             string line;
  73.  
  74.             StreamReader strReader = new StreamReader(fName);
  75.             while ((line = strReader.ReadLine()) != null)
  76.             {
  77.                 fileList.Add(line);
  78.             }
  79.             strReader.Close();
  80.  
  81.             return fileList;
  82.         }
  83.     }



Con la suddetta classe gestisco bene le stringhe sul file. Ma non riesco in ogni modo a leggere array di byte dal file. Ho cercato sulla rete ma niente di utili...Aspetto consigli, grazie (grazie soprattuto al Totem).
Ciao =)

PM
Avatar
balto (Ex-Member)
Rookie


Messaggi: 44
Iscritto: 03/11/2009

Segnala al moderatore
Postato alle 14:59
Sabato, 09/01/2010
Ah ho trovato il sistema per fare ciò che desidero.
Grazie dei consigli Totem =)

PM