So che molti di voi avranno detto alla lezione precedente lanciando l’applicazione
AGENDA:
“A che cavolo mi serve nà agenda che appena la chiudo perde tutti
i dati?”
Che vi devo dire?
Avete perfettamente ragione
Bene provvediamo subito.
Introduciamo una classe per la gestione dei File sulle cosiddette
Memorie di Massa (Hard Disk, floppy, ecc.)
La classe in questione è CFile.
Tale classe permette di trasferire i dati in memoria (RAM) su
disco e viceversa.
A fine lezione la nostra AGENDA funzionerà quindi alla perfezione,
permettendo di salvare i dati in chiusura del programma e quindi
ritrovare in fase di rilancio i dati precedentemente salvati.
Da premettere che questo sistema non è molto utilizzato; normalmente
si utilizzano classi di gestione di Database Access per programmi
gestionali.
Ciò è dovuto al fatto che tali classi mettono a disposizione metodi
alquanto difficili da realizzare in C++ puro.
Tali metodi tra l’altro offrono anche sistemi di gestione
delle memorie di massa ottimali rispetto alla classe CFile.
Perché allora studiarla?
Semplice: perché ogni buon informatico deve avere conoscenze a
basso livello della macchina su cui lavora, del sistema operativo
che utilizza, di come esso agisce e tale classe vi assicuro è
degna di nota.
Non ci credete?
Provate a costruirvi i vecchi comandi MS-DOS usando tale classe
come DEL, RENAME, MOVE, ecc.
Noterete da soli la potenza di tale classe.
Analizzeremo la gestione dei Database in seguito.
Per ora ci interessa conoscere la gestione (diciamo a basso livello)
dei file, al fine di avere + controllo e conoscenza delle memorie
di massa stesse.
Rammendandovi che il C++ deriva dal C non vi stupirete della somiglianza
della classe CFile con i vecchi metodi usati per la gestione dei
file in C (FILE * insomma).
Per capire a pieno l’oggetto CFile paragonatelo un po’
al FILE* del Linguaggio C.
Infatti un CFile una volta creato deve essere collegato a un file
esistente (apertura di un file in lettura o scrittura) o deve
creare un nuovo file (creazione di un nuovo file).
Volendo fare un po’ di pratica x capire a pieno tale vicinanza
tra il FILE * e CFile provate a costruire una vostra classe (chiamatela
CMyFile) usando solo metodi del Linguaggio C puro; noterete che
non è difficile.
Ma che cosa è un FILE?
Un file è una sequenza sequenziale di byte (formattati o meno)
memorizzata su disco.
Il file può essere aperto in varie modalità:
Lettura;
Scrittura;
Lettura e Scrittura;
Scrittura in Append.
Tale scelta viene effettuata in fase di apertura o creazione del
file per mezzo delle funzioni Open che accettano sempre oltre
al nome del file anche uno o più flag identificativi della modalità
di apertura.
Una volta aperto il file può essere scorso per mezzo di una lettura/scrittura
sequenziale byte x byte oppure ci si può posizionare su un particolare
punto dello stesso per mezzo delle funzioni di SEEK.
Tali Funzioni accettano sempre due parametri: da dove iniziare
lo spostamento (Inizio, Fine, Posizione Corrente) e di quanti
byte spostarsi da tale punto di partenza.
Quindi ogni file ha un puntatore interno che indica la posizione
corrente.
Bene, forti di queste conoscenze andiamo a introdurre la nostra
classe MFC.
CFile è una classe derivata da CObject per cui ogni metodo di
tale classe (vedi lezioni 46-47) può essere utilizzato.
Andiamo ad analizzare i metodi maggiormente utilizzati per la
nostra classe (per maggiori informazioni consultare le MSDN)
CFile
Costruttori e operazioni di base sui file
| CFile( ); |
Costruttori
di base. Creano un oggetto CFile. |
| virtual BOOL Open(LPCTSTR nomefile, UINT flag); |
Apre un file. |
| virtual void Close(); |
Chiude un file. |
Input/Output e stato del file
| virtual UINT Read(void* buffer,UINT num); |
Legge num byte da un CFile a partire dalla posizione corrente e li memorizza in buffer |
| virtual void Write(const void*buffer, UINT num); |
Scrive num byte memorizzati in buffer in un CFile |
| virtual LONG Seek(LONG offset, UINT dadove); |
Posiziona il puntatore interno del file offset byte in avanti o in indietro a partire da dadove. |
| virtual DWORD GetLenght() const; |
Restituisce la grandezza del CFile in byte |
| virtual DWORD GetPosition() const; |
Restituisce la posizione del puntatore interno del CFile |
| virtual CString GetFileName() const; |
Restituisce il nome del file |
| virtual CString GetFilePath() const; |
Restituisce il percorso complete del file. |
| static void PASCAL Rename(LPCTSTR nomevecchio, LPCTSTR nuovofile); |
Rinomina il CFile |
| static void PASCAL Remove(LPCTSTR nomefile); |
Cancella il file specificato |
| BOOL GetStatus(CFileStatus& status) const; |
Preleva gli attributi del CFile |
| static void SetStatus(LPCTSTR nomefile, const CFileStatus& status); |
Setta gli attributi del CFile |
Bene per ora fermiamoci qui.
La prossima lezione analizzeremo meglio le funzioni sopra descritte e modificheremo
la nostra agenda, forti delle nuove conoscenze.
Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet