Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS C FAQs C TUTORIELS C LIVRES C COMPILATEURS C SOURCES GTK+

Tutorial d'initiation
A la programmation avec l'API Windows

Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
PrécédentIndexSuivant

Chapitre 4

Le système de fichier

2. Création et ouverture d'un fichier

Cours théorique :

L'API Windows fournit la fonction CreateFile() pour ouvrir ou créer des fichiers. Cette fonction permet de gérer le partage du fichier au niveau système, les attributs de ce fichiers. Il est important de bien comprendre les paramètres principaux de cette fonction.

Avant la description plus en détail de cette fonction, il est important de bien comprendre le fonctionnement du système de fichiers sous Windows. Comme cet environnement est multi-tâches, il est possible qu'un fichier soit accédé en même temps par plusieurs programmes ou même par le même programme. Le premier programme à demander l'accès au fichier doit préciser si il souhaite ou non le partager. Si le fichier n'est pas partagé, le système refusera tout autre appel à CreateFile() pour accéder à ce fichier. Le fichier ne sera donc plus accessible au reste du système. Le fichier restera 'réservé' jusqu'à ce que le programme se termine ou jusqu'à ce que la fonction CloseHandle() soit appelée (cette dernière fonction sera expliquée plus tard). En ne partageant pas le fichier le programme s'assure qu'il est le seul à accéder au fichier.

Un fichier peut également être partagé en lecture. Dans ce cas, seul le programme ayant accédé au fichier en premier aura un accès en lecture/écriture. Les appels suivants à CreateFile() permetteront seulement d'accéder au fichier en lecture.

Si le fichier est partagé en lecture/écriture, alors l'accès simultané en lecture ou écriture à ce fichier est autorisé. Plusieurs programmes peuvent donc lire ou écrire des données simultanément dans ce fichier. Ce dernier mode de partage est très dangereux et ne doit être utilisé qu'en connaissance de cause.

Lors du premier appel à CreateFile(), le mode de partage du fichier est défini. Il ne pourra pas être modifié par un autre appel. Même si le fichier est partagé, son mode de partage ne pourra pas être modifié. Si l'appel à la fonction CreateFile() réussit, le système retourne un HANDLE au programme. Ce HANDLE identifie le fichier. La fonction CloseHandle() permet de refermer le fichier. A partir de cet appel, le HANDLE identifiant le fichier n'est plus valide.

L'identifiant du fichier stocke également la position courante du pointeur. Le système stockera donc la position courante d'écriture pour chaque nouvel appel à CreateFile(). Si le fichier est ouvert 10 fois simultanément, le système stockera 10 positions. Le partage du fichier n'entraîne donc aucune modification dans les méthodes de lecture/écriture sur le fichier (le pointeur courant ne sera pas modifié même si un autre programme accède le fichier). Cependant, si deux threads utilisent le même HANDLE pour accéder à un fichier, alors le pointeur pourra être modifié par l'un ou par l'autre. Si le même thread fait deux appels successifs à l'API pour lire le fichier, rien ne garantit qu'il lira deux blocs successifs. En effet, si le deuxième thread a modifié le pointeur entre les deux appels, alors la lecture se poursuivra à la nouvelle position.

Pour éviter des complications, le plus simple est généralement de ne pas partager les fichiers ou d'autoriser seulement le partage en lecture.

Voici un détail de principaux arguments de la fonction CreateFile() :

HANDLE CreateFile(
  LPCTSTR lpFileName,          // pointer to name of the file
  DWORD dwDesiredAccess,       // access (read-write) mode
  DWORD dwShareMode,           // share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                               // pointer to security attributes
  DWORD dwCreationDisposition,  // how to create
  DWORD dwFlagsAndAttributes,  // file attributes
  HANDLE hTemplateFile         // handle to file with attributes to
                               // copy
);

lpFileName est le nom du fichier à ouvrir ou à créer.

DwDesiredAccess est le type d'accès demandé : lecture (GENERIC_READ), écriture (GENERIC_WRITE) ou les deux. Si le fichier est partagé en lecture seulement et qu'un accès en écriture est demandé, la fonction retournera une erreur.

DwShareMode indique le mode de partage demandé. Ce mode peut être non partagé (NULL), partagé en lecture (FILE_SHARE_READ), partagé en écriture (FILE_SHARE_WRITE) ou les deux.

DwCreationDisposition indique la méthode utilisée pour lire ou créer le fichier. CREATE_NEW demande la création d'un fichier. Si le fichier existe déjà, la fonction retournera une erreur. CREATE_ALWAYS demande la création d'un fichier. Si le fichier existe déjà, il est écrasé. OPEN_EXISTING demande l'ouverture d'un fichier existant. Si le fichier n'existe pas, le fonction retourne une erreur. PEN_ALWAYS demande l'ouverture du fichier. Si le fichier n'existe pas il est créé.

dwFlagsAndAttributes indique les attributs utilisés pour créer le fichier.

La fonction retournera un HANDLE en cas de succès ou INVALID_HANDLE_VALUE, c'est à dire le pointeur 0xFFFFFFFF est cas d'erreur.

Dès que le fichier n'est plus utilisé, l'application peut utiliser CloseHandle() pour signifier qu'elle n'utilise plus le fichier spécifié. Toute autre application pourra alors avoir accès à ce fichier si elle le demande.


PrécédentIndexSuivant

Responsable bénévole de la rubrique C : Arnaud Feltz (buchs) - Contacter par EMail :
Vos questions techniques : forum d'entraide C - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.