C# I FILES Durante il normale sviluppo di applicazioni può succedere di dover memorizzare i dati inseriti dall utente nel corso dell esecuzione del programma. C# offre numerose possibilità per memorizzare le informazioni, quelle che vedremo sono: i file testuali dove i contenuti sono interpretabili con la semplice apertura del file con un editor di testo i file binari dove i contenuti non sono consultabili con la semplice apertura del file con un editor di testo Quando si intende memorizzare le informazioni in un file, occorre analizzare la tipologia e il numero di informazioni, per poterle organizzare, in modo da riuscire a leggerle successivamente per poterle reinterpretare. Ad esempio, se volessimo memorizzare le seguenti informazioni relative ad una persona: Nome Telefono Indirizzo Potremmo scrivere ogni informazione su di una singola riga, in modo da facilitare la successiva lettura, ad esempio: Rossi 338-234567 Via della luna, 14 Ma se le informazioni dovessero riguardare più persone, occorrerebbe separare le informazioni di una persona dall altra, e le possibilità potrebbero essere: scrivendole consecutivamente, su righe diverse, tenendo presente che il numero di informazioni relative a ciascuna persona sono sempre lo stesso numero di righe (3 nel nostro caso), esempio: Rossi 338-1234567 Via della luna, 14 Bianchi 338-1234567 Via del sole, 25 scrivendo tutte le informazioni relative ad una persona sulla stessa riga, separandole con un carattere speciale, ad esempio Rossi 338-1234567 Via della luna, 14 Bianchi 338-1234567 Via del sole, 25 In questo caso il recupero delle informazioni dal file comprenderà la separazione delle informazioni, e il problema potrebbe risolversi con l utilizzo del metodo Split del tipo string che separa le stringhe divise dallo stesso carattere e le restituisce sotto forma di in un array di stringhe, esempio: string[] informazioni = rigafile.split( ); Una volta stabilita la metodologia di memorizzazione è possibile utilizzare le classi seguenti per interagire con il file: File per ottenere informazioni su di un file, per crearlo o per aprirlo Directory per ottenere informazioni su di una cartella o per crearla BinaryWriter per scrivere in un file binario BinaryReader per leggere da un file binario StreamWriter per scrivere in un file di testo StreamReader per leggere da un file di testo
Classe System.IO.File E una classe statica che consente di eseguire diverse operazioni sui file. Metodi di uso comune: void Copy (string asorgente, string adestinazione, bool asovrascrivi) Copia il file asorgente in adestinazione, sovrascrivendo se indicato void Delete (string apercorso) Elimina il file specificato bool Exists (string apercorso) Verifica l esistenza del file specificato void Move (string asorgente, string adestinazione) Sposta il file asorgente in adestinazione Metodi per la gestione dei file TESTUALI: StreamWriter CreateText (string apercorso) Crea un file per scrivervi del testo. Restituisce lo stream su cui scrivere. StreamReader OpenText (string apercorso) Apre un file in lettura. Restituisce lo stream da cui leggere void AppendAllText (string apercorso, string acontenuto) Scrive tutto il testo di acontenuto alla fine del file indicato in apercorso StreamWriter AppendText (string apercorso) Apre il file indicato in apercorso predisponendolo per l accodamento del testo alla fine del file. Restituisce lo stream su cui scrivere. string[] ReadAllLines (string apercorso) Legge tutte le righe dal file specificato, restituendole in forma di array di stringhe, una per ogni riga string ReadAllText (string apercorso) Legge tutto il contenuto del file e lo restituisce in forma di stringa void WriteAllLines (string apercorso, string[] alinee) Scrive tutte le righe indicate dall array alinee nel file apercorso void WriteAllText (string apercorso, string acontenuto) Scrive tutto il testo indicato nel file apercorso Metodi per la gestione dei file BINARI: FileStream Create (string apercorso) Crea o sovrascrive il file indicato in apercorso. Restituisce lo stream su cui scrivere. FileStream OpenRead (string apercorso) Apre un file binario in SOLA lettura. Restituisce lo stream da cui leggere FileStream OpenWrite (string apercorso) Apre un file binario in SOLA scrittura. Restituisce lo stream su cui scrivere Classe System.IO.Directory E una classe statica che consente di eseguire diverse operazioni sulle cartelle. DirectoryInfo CreateDirectory (string apercorso) Crea la cartella indicata in apercorso, e tutte le cartelle intermedie. DirectoryInfo è una classe contenente informazioni sulla cartella creata. void Delete (string apercorso, bool aricorsiva) Elimina la cartella indicata, comprese le sottocartelle se aricorsiva è TRUE bool Exists (string apercorso) Verifica l esistenza della cartella specificata void Move (string asorgente, string adestinazione) Sposta la cartella asorgente in adestinazione Sono tutte classi adibite allo scorrimento dei dati contenuti in un file. Ogni volta che si ha conclusa un operazione di lettura/scrittura occorre liberare le risorse utilizzate dall istanza utilizzata, chiamandone il metodo Close().
Classe System.IO.BinaryReader Consente di leggere il contenuto di un file binario. bool ReadBoolean() Legge un valore booleano byte ReadByte() Legge un byte byte[] ReadBytes(int anumero) Legge il numero di bytes indicato char ReadChar () Legge un char char[] ReadChars (int anumero) Legge il numero di caratteri indicato double ReadDouble() Legge un numero double Int16 ReadInt16 () Int32 ReadInt32 () Int64 ReadInt64 () Legge un intero (a 16, 32 o 64 bit. Il tipo int corrisponde ad un Int32) string ReadString () Legge una stringa Classe System.IO.BinaryWriter Consente di scriver in un file binario. void Write(bool avalore) Scrive un valore booleano void Write(byte avalore) Scrive un byte void Write(byte[] avalore) Scrive un array di bytes void Write(char avalore) Scrive un char void Write(char[] avalore) Scrive un array di char void Write(double avalore) Scrive un numero double void Write(int avalore) Scrive un numero a 32 bit void Write(long avalore) Scrive un numero a 64 bit void WriteString (string avalore) Scrive una stringa Classe System.IO.StreamReader Consente di leggere il contenuto di un file testuale string ReadLine () Legge una riga intera dal file string ReadToEnd () Legge tutto il contenuto del file dalla posizione corrente fino alla fine
Classe System.IO.StreamWriter Consente di leggere il contenuto di un file testuale void Write(bool avalore) Scrive un valore booleano void Write(byte avalore) Scrive un byte void Write(byte[]aValore) Scrive un array di bytes void Write(char avalore) Scrive un char void Write(char[]aValore) Scrive un array di char void Write(double avalore) Scrive un numero double void Write(int avalore) Scrive un numero a 32 bit void Write(long avalore) Scrive un numero a 64 bit void WriteString (string avalore) Scrive una stringa void WriteLine (string avalore) Scrive il testo specificato e inizia una nuova riga
Esempio di lettura/scrittura con un file TESTUALE // Creazione del file e scrittura // Creazione file StreamWriter sw = File.CreateText("c:\\test.txt"); // Scrittura righe sw.writeline("prima riga"); sw.writeline("seconda riga"); sw.close(); Console.WriteLine("File creato con successo!"); // Lettura contenuti // Apertura file StreamReader sr = File.OpenText("c:\\test.txt"); // Lettura di tutte le righe presenti string testo = sr.readline(); while(testo!= null) Console.WriteLine(testo); testo = sr.readline(); sr.close(); Console.WriteLine("File letto con successo!"); // Accodamento contenuti // Apertura file StreamWriter sw = File.AppendText("C:\\test.txt"); // Accodamento nuovo testo sw.writeline("questa linea è stata accodata"); sw.close(); Console.WriteLine("Accodamento testo riuscito!");
Esempio di lettura/scrittura con un file BINARIO // Scrittura binaria // Apertura file in scrittura FileStream fs = File.Create("c:\\test.bin"); BinaryWriter bw = new BinaryWriter(fs); // Preparazione dati da scrivere int varintero = 10; double vardouble = 1500.34; string varstring = "Ciao Mondo!"; // Scrittura dati bw.write(10); bw.write(vardouble); bw.write(varstring); bw.close(); fs.close(); Console.WriteLine("Scrittura binaria riuscita!"); // Lettura binaria // Apertura file in lettura FileStream fs = File.OpenRead( C:\\test.bin ); BinaryReader br = new BinaryReader(fs); // Lettura contenuti Console.WriteLine(br.ReadInt32()); Console.WriteLine(br.ReadDouble()); Console.WriteLine(br.ReadString()); br.close(); fs.close(); Console.WriteLine("Lettura binaria riuscita!");