Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
07/01/10 16:34
balto
Ciao ragazzi, ho un problema riguardante le due classi citate nel titolo. Allora: creo un file dati con:
FileStream fs = new FileStream(fileName, FileMode.Create);
fs.close();


Dopodichè aggiungo delle stringhe con:
FileStream fileStream = new FileStream(fileName, FileMode.Open);
BinaryWriter bw = new BinaryWriter(fileStream);
bw.Write("uno");
bw.Write("due");
bw.Write("tre");
bw.Close();
fileStream.Close();


Poi leggo le stringhe del file con:
FileStream fileStream = new FileStream(fileName, FileMode.Open);
BinaryReader br = new BinaryReader(fileStream);
while (br.PeekChar() != -1)
{
Console.WriteLine(br.ReadString());
}


E fin qui tutto normale. Ma se nella parte di codice contenente il BinaryWriter scrivo questo:
FileStream fileStream = new FileStream(fileName, FileMode.Open);
BinaryWriter bw = new BinaryWriter(fileStream);
bw.Seek(0, Begin); // non ricordo il nome dell'enumeratore
bw.Write("uno");
bw.Write("due");
bw.Write("tre");
bw.Close();
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 07/01/10 16:37
aaa
07/01/10 16:42
Il Totem
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.
aaa
07/01/10 17:02
balto
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 =)
aaa
08/01/10 15:54
balto
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
aaa
09/01/10 12:56
Il Totem
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.
aaa
09/01/10 13:05
balto
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.

class DESAlgorithm
    {
        public static byte[] Encrypt(string text, SymmetricAlgorithm key)
        {
            MemoryStream memStream = new MemoryStream();
            CryptoStream encStream = new CryptoStream(memStream, key.CreateEncryptor(), CryptoStreamMode.Write);
            StreamWriter strWriter = new StreamWriter(encStream);
            strWriter.WriteLine(text);
            strWriter.Close();
            encStream.Close();
            byte[] buffer = memStream.ToArray();
            memStream.Close();
            return buffer;
        }

        public static string Decrypt(byte[] CypherText, SymmetricAlgorithm key)
        {
            MemoryStream memStream = new MemoryStream(CypherText);
            CryptoStream encStream = new CryptoStream(memStream, key.CreateDecryptor(), CryptoStreamMode.Read);
            StreamReader strReader = new StreamReader(encStream);
            string text = strReader.ReadLine();
            strReader.Close();
            encStream.Close();
            memStream.Close();
            return text;
        }
    }


class StreamManager
    {
        private static string fileName;

        public static string fName
        {
            get { return fileName; }
            set { fileName = value; }
        }

        private StreamManager()
        {
        }

        public static void AddData(string username, string password, string informations)
        {
            FileStream fileStream = new FileStream(fName, FileMode.Append);
            StreamWriter strWriter = new StreamWriter(fileStream);
            strWriter.WriteLine(username);
            strWriter.WriteLine(password);
            strWriter.WriteLine(informations);
            strWriter.Close();
            fileStream.Close();
        }

        public static void RemoveData(int index)
        {
            int newIndex = index * 3;
            
            List<string> fileList = new List<string>();
            fileList = StreamManager.ReadData();
            fileList.RemoveAt((newIndex + 2));
            fileList.RemoveAt((newIndex + 1));
            fileList.RemoveAt(newIndex);

            FileStream fileStream = new FileStream(fName, FileMode.Truncate);
            StreamWriter strWriter = new StreamWriter(fileStream);
            foreach (string strData in fileList)
            {
                strWriter.WriteLine(strData);
            }
            strWriter.Close();
            fileStream.Close();
        }

        public static void EditData(int index, string username, string password, string informations)
        {
            string newUsername = username;
            string newPassword = password;
            string newInformations = informations;
            int newIndex = index * 3;
            
            List<string> fileList = new List<string>();
            fileList = StreamManager.ReadData();
            fileList[newIndex] = fileList[newIndex].Replace(fileList[newIndex], newUsername);
            fileList[(newIndex + 1)] = fileList[(newIndex + 1)].Replace(fileList[(newIndex + 1)], newPassword);
            fileList[(newIndex + 2)] = fileList[(newIndex + 2)].Replace(fileList[(newIndex + 2)], newInformations);

            FileStream fileStream = new FileStream(fName, FileMode.Truncate);
            StreamWriter strWriter = new StreamWriter(fileStream);
            foreach (string strData in fileList)
            {
                strWriter.WriteLine(strData);
            }
            strWriter.Close();
            fileStream.Close();
        }

        public static List<string> ReadData()
        {
            List<string> fileList = new List<string>();
            string line;

            StreamReader strReader = new StreamReader(fName);
            while ((line = strReader.ReadLine()) != null)
            {
                fileList.Add(line);
            }
            strReader.Close();

            return fileList;
        }
    }


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 =)
aaa
09/01/10 13:59
balto
Ah ho trovato il sistema per fare ciò che desidero.
Grazie dei consigli Totem =)
aaa