Corso di Visual C++

Gestione dei file

 

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( );

CFile( LPCTSTR nomefile, UINT flag);

Costruttori di base. Creano un oggetto CFile.
Il primo metodo crea un CFile che non punta a nulla.
Il secondo crea un fle che prende in input il nome del file da creare o aprire e la modalità di apertura (lettura o scrittura)

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