Gestione File System e I/O in Windows 2000 Implementazione del File System FAT-12, FAT-16, FAT-32 NTFS API relative al File System Gestione dei dispositivi di I/O
Il File System MS-DOS Rappresentazione di una directory in MS-DOS Attributi : file nascosto, file di sistema, ecc.
Il File System DOS in Windows 95/98 massima ampiezza delle partizioni per diverse ampiezze dei blocchi FAT32 utilizza in realtà 28 bit e permette una minore frammentazione Si ha una File Allocation Table mantenuta in memoria (solo in parte per FAT32).
Il File System di Windows 98 (FAT32) La rappresentazione estesa di una directory MS-DOS utilizzata in Windows 98 Bytes
Il File System di Windows 98 (2) La rappresentazione di (parte di) un nome di file lungo in Windows 98 Bytes Checksum
NTFS (Windows NT/2000) Indirizzi a 64 bit Nomi dei file in codifica Unicode Case-sensitive Stream multipli e attibuti associati ad un file I blocchi vanno da 512 bytes a 64K (standard 4 Kb) Supporta compressione e crittografia dei file
Struttura del File System NTFS La master file table di NTFS (1024 record da 1K)
Struttura del File System NTFS Gli attributi usati nei record MFT partizioni
Struttura del File System NTFS Un record MFT per un file di 3 run e 9 blocchi
Struttura del File System NTFS Un file che richiede 3 MFT record per memorizzare i suoi run
File System API in Windows 2000 Principali chiamate della Win32 API relative ai file con il loro equivalente Unix più vicino
Creazione di un File CreateFile ( nome, // nome del file accesso, // modo accesso (lettura, scrittura o entrambi) condivisione, // condivisione del file (0 nessuna condivisione) security, // attributi di sicurezza creazione, // creare il file o no se non esiste Attributi, // attributi vari (compressione, nascosto, ecc..) oldFile // handle di un file da cui copiare gli attributi (NULL indica nessun file) );
System Call per la gestione dei file accesso: GENERIC_READ GENERIC_WRITE condivis.: FILE_SHARE_READ FILE_SHARE_WRITE 0 creazione: CREATE_NEW CREATE_ALWAYS OPEN_EXISTING OPEN_ALWAYS INVALID_HANDLE_VALUE indica fallimento nella create Esempio: Handle hfile; hfile = CreateFile (pippo, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); If (hfile==INVALID_HANDLE_VALUE) printf (errore nella creazione file \n);
System Call per la gestione dei file S= WriteFile (handle, buffer, lung, &bytescritti,NULL); S= ReadFile (handle, buffer, lung, &byteletti,NULL); S vale 1 in caso di successo Esempio: { HANDLE hfile; DWORD bytescritti; int s; char buffer[]=buonasera; hfile = CreateFile (pippo, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); s = WriteFile (hfile, buffer, 9,&bytescritti,NULL); CloseHandle (hfile); }
System Call per la gestione dei file pos=SetFilePointer (handle, offset, offsetAlto, puntoPartenza); puntoPartenza: FILE_BEGIN inizio file FILE_CURRENT posizione corrente FILE_END fine file pos = posizione dallinizio del file. Esempio: hfile=CreateFile(topo,…); pos=SetFilePointer(hfile, 12, NULL,FILE_BEGIN); /* si sposta nella posizione 12 del file topo */
System Call per la gestione dei file s=LockFile (handle, offset, offsetAlto, lung, lungAlto); s=UnLockFile (handle, offset, offsetAlto, lung, lungAlto); Lock non permette a nessun altro processo di accedere alla porzione di file a partire dalla posizione offset fino alla posizione offset+lung. Unlock rilascia laccesso.
Scriviamo 5 interi su file e li leggiamo HANDLE hfile; DWORD bytescritti,byteletti; int s,i; int buffer[]={5,7,12,8,9}; int bufferLett[5]; hfile = CreateFile ("pippo", GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL); s = WriteFile (hfile, buffer, 5*sizeof(int),&bytescritti,NULL); SetFilePointer(hfile,0,NULL,FILE_BEGIN); s = ReadFile (hfile, bufferLett, 5*sizeof(int),&byteletti,NULL); for (i=0;i<5;i++) printf ("%d\n",bufferLett[i]); CloseHandle (hfile);
Driver dei dispositivi di I/O Un driver deve essere conforme al Windows Driver Model, cioè deve, fra laltro: Gestire le richieste di I/O standard (I/O Request Packet) Essere basato su oggetti Essere rientrante nel caso di sistemi multiprocessore Essere compatibile fra Windows 98 e 2000
Gestione dellI/O (es. di utilizzo di porta seriale) #include int main() { HANDLE handle; char buffer[40] = …………….."; DWORD bytescritti; handle = CreateFile("COM1", GENERIC_READ, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); SetCommState(….); // setta alcuni parametri della porta SetCommTimeouts (…); / setta i timeout della porta WriteFile(handle, buffer, 40, &bytescritti, 0); CloseHandle (handle); }// fine main