Création et ouverture de fichiers

La fonction CreateFile peut créer un fichier ou ouvrir un fichier existant. Vous devez spécifier le nom du fichier, les instructions de création et d’autres attributs. Lorsqu’une application crée un fichier, le système d’exploitation l’ajoute au répertoire spécifié.

Le système d’exploitation attribue un identificateur unique, appelé handle, à chaque fichier ouvert ou créé à l’aide de CreateFile. Une application peut utiliser ce handle avec des fonctions qui lisent, écrivent dans et décrivent le fichier. Elle est valide jusqu’à ce que toutes les références à ce handle soient fermées. Lorsqu’une application démarre, elle hérite de tous les handles ouverts du processus qui l’a démarrée si les handles ont été créés comme pouvant être hérités.

Une application doit case activée la valeur du handle retourné par CreateFile avant d’essayer d’utiliser le handle pour accéder au fichier. Si une erreur se produit, la valeur de handle est INVALID_HANDLE_VALUE et l’application peut utiliser la fonction GetLastError pour obtenir des informations d’erreur étendues.

Lorsqu’une application utilise CreateFile, elle doit utiliser le paramètre dwDesiredAccess pour spécifier si elle a l’intention de lire à partir du fichier, d’écrire dans le fichier, de lire et d’écrire, ou ni l’un ni l’autre. Il s’agit de la demande d’un mode d’accès. L’application doit également utiliser le paramètre dwCreationDisposition pour spécifier l’action à entreprendre si le fichier existe déjà, appelée disposition de création. Par exemple, une application peut appeler CreateFile avec dwCreationDisposition défini sur CREATE_ALWAYS pour créer toujours un fichier, même si un fichier du même nom existe déjà (ce qui remplace le fichier existant). La réussite ou non de cette opération dépend de facteurs tels que les attributs et les paramètres de sécurité du fichier précédent (pour plus d’informations, consultez les sections suivantes).

Une application utilise également CreateFile pour spécifier si elle souhaite partager le fichier pour la lecture, l’écriture, les deux ou ni l’un ni l’autre. Il s’agit du mode de partage. Un fichier ouvert qui n’est pas partagé (dwShareMode défini sur zéro) ne peut pas être rouvert, soit par l’application qui l’a ouvert, soit par une autre application, tant que son handle n’a pas été fermé. Il s’agit également de l’accès exclusif.

Lorsqu’un processus utilise CreateFile pour tenter d’ouvrir un fichier qui a déjà été ouvert en mode de partage (dwShareMode défini sur une valeur différente de zéro valide), le système compare les modes d’accès et de partage demandés à ceux spécifiés lors de l’ouverture du fichier. Si vous spécifiez un mode d’accès ou de partage qui est en conflit avec les modes spécifiés dans l’appel précédent, CreateFile échoue.

Le tableau suivant illustre les combinaisons valides de deux appels à CreateFile à l’aide de différents modes d’accès et modes de partage (respectivement dwDesiredAccess, dwShareMode ). Peu importe l’ordre dans lequel les appels CreateFile sont effectués. Toutefois, toutes les opérations d’E/S de fichier suivantes sur chaque handle de fichier seront toujours limitées par les modes d’accès et de partage actuels associés à ce handle de fichier particulier.

Premier appel à CreateFile Deuxième appel valide à CreateFile
GENERIC_READ, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_READFILE_SHARE_WRITE
GENERIC_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_WRITE, FILE_SHARE_READFILE_SHARE_WRITE
GENERIC_READ, FILE_SHARE_READ FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_READGENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_READGENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_READ FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_READ, GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
  • GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE

En plus des attributs de fichier standard, vous pouvez également spécifier des attributs de sécurité en incluant un pointeur vers une structure SECURITY_ATTRIBUTES comme quatrième paramètre de CreateFile. Toutefois, le système de fichiers sous-jacent doit prendre en charge la sécurité pour que cela ait un effet quelconque (par exemple, le système de fichiers NTFS le prend en charge, mais les différents systèmes de fichiers FAT ne le font pas). Pour plus d’informations sur les attributs de sécurité, consultez Access Control.

Une application qui crée un fichier peut fournir un handle facultatif à un fichier modèle, à partir duquel CreateFile prend des attributs de fichier et des attributs étendus pour la création du nouveau fichier.

Scénarios CreateFile

Il existe plusieurs scénarios fondamentaux pour lancer l’accès à un fichier à l’aide de la fonction CreateFile . Ces éléments sont résumés comme suit :

  • Création d’un fichier lorsqu’un fichier portant ce nom n’existe pas déjà.
  • Création d’un fichier même si un fichier du même nom existe déjà, effacez ses données et commencez à vider.
  • Ouverture d’un fichier existant uniquement s’il existe, et uniquement intact.
  • Ouverture d’un fichier existant uniquement s’il existe, tronquée pour qu’il soit vide.
  • Ouverture d’un fichier toujours : tel quel s’il existe, création d’un fichier s’il n’existe pas.

Ces scénarios sont contrôlés par l’utilisation appropriée du paramètre dwCreationDisposition . Vous trouverez ci-dessous une répartition de la façon dont ces scénarios sont mappés aux valeurs de ce paramètre et de ce qui se passe quand ils sont utilisés.

Lors de la création ou de l’ouverture d’un fichier lorsqu’un fichier portant ce nom n’existe pas encore (dwCreationDisposition défini sur CREATE_NEW, CREATE_ALWAYS ou OPEN_ALWAYS), la fonction CreateFile effectue les actions suivantes :

  • Combine les attributs et indicateurs de fichier spécifiés par dwFlagsAndAttributes avec FILE_ATTRIBUTE_ARCHIVE.
  • Définit la longueur du fichier sur zéro.
  • Copie les attributs étendus fournis par le fichier modèle dans le nouveau fichier si le paramètre hTemplateFile est spécifié (cela remplace tous les indicateurs FILE_ATTRIBUTE_* spécifiés précédemment).
  • Définit l’indicateur hérite spécifié par le membre bInheritHandle et le descripteur de sécurité spécifié par le membre lpSecurityDescriptor du paramètre lpSecurityAttributes (SECURITY_ATTRIBUTES structure), s’il est fourni.

Lors de la création d’un fichier même si un fichier du même nom existe déjà (dwCreationDisposition défini sur CREATE_ALWAYS), la fonction CreateFile effectue les actions suivantes :

  • Vérifie les attributs de fichier actuels et les paramètres de sécurité pour l’accès en écriture, en cas d’échec en cas de refus.
  • Combine les attributs et indicateurs de fichier spécifiés par dwFlagsAndAttributes avec FILE_ATTRIBUTE_ARCHIVE et les attributs de fichier existants.
  • Définit la longueur du fichier sur zéro (autrement dit, toutes les données qui se trouve dans le fichier ne sont plus disponibles et le fichier est vide).
  • Copie les attributs étendus fournis par le fichier modèle dans le nouveau fichier si le paramètre hTemplateFile est spécifié (cela remplace tous les indicateurs FILE_ATTRIBUTE_* spécifiés précédemment).
  • Définit l’indicateur hérite spécifié par le membre bInheritHandle du paramètre lpSecurityAttributes (structure SECURITY_ATTRIBUTES) s’il est fourni, mais ignore le membre lpSecurityDescriptor de la structure SECURITY_ATTRIBUTES .
  • En cas de réussite (c’est-à-dire, CreateFile retourne un handle valide), l’appel de GetLastError génère le code ERROR_ALREADY_EXISTS, même si pour ce cas d’usage particulier, il ne s’agit pas d’une erreur en tant que telle (si vous avez l’intention de créer un fichier « nouveau » (vide) à la place du fichier existant).

Lors de l’ouverture d’un fichier existant (dwCreationDisposition défini sur OPEN_EXISTING, OPEN_ALWAYS ou TRUNCATE_EXISTING), la fonction CreateFile effectue les actions suivantes :

  • Vérifie les attributs de fichier actuels et les paramètres de sécurité pour l’accès demandé, en cas d’échec en cas de refus.
  • Combine les indicateurs de fichier (FILE_FLAG_*) spécifiés par dwFlagsAndAttributes avec les attributs de fichier existants et ignore tous les attributs de fichier (FILE_ATTRIBUTE_*) spécifiés par dwFlagsAndAttributes.
  • Définit la longueur du fichier sur zéro uniquement si dwCreationDisposition a la valeur TRUNCATE_EXISTING, sinon, la longueur actuelle du fichier est conservée et le fichier est ouvert en l’état.
  • Ignore le paramètre hTemplateFile .
  • Définit l’indicateur hérite spécifié par le membre bInheritHandle du paramètre lpSecurityAttributes (structure SECURITY_ATTRIBUTES) s’il est fourni, mais ignore le membre lpSecurityDescriptor de la structure SECURITY_ATTRIBUTES .

Attributs de fichier et répertoires

Les attributs de fichier font partie des métadonnées associées à un fichier ou à un répertoire, chacun ayant son propre objectif et ses propres règles sur la façon dont il peut être défini et modifié. Certains de ces attributs s’appliquent uniquement aux fichiers, et d’autres uniquement aux répertoires. Par exemple, l’attribut FILE_ATTRIBUTE_DIRECTORY s’applique uniquement aux répertoires : il est utilisé par le système de fichiers pour déterminer si un objet sur le disque est un répertoire, mais il ne peut pas être modifié pour un objet de système de fichiers existant.

Certains attributs de fichier peuvent être définis pour un répertoire, mais ont une signification uniquement pour les fichiers créés dans ce répertoire, agissant en tant qu’attributs par défaut. Par exemple, FILE_ATTRIBUTE_COMPRESSED peut être défini sur un objet directory, mais comme l’objet directory lui-même ne contient pas de données réelles, il n’est pas vraiment compressé ; Toutefois, les répertoires marqués avec cet attribut indiquent au système de fichiers de compresser tous les nouveaux fichiers ajoutés à ce répertoire. Tout attribut de fichier qui peut être défini sur un répertoire et qui sera également défini pour les nouveaux fichiers ajoutés à ce répertoire est appelé attribut hérité.

La fonction CreateFile fournit un paramètre permettant de définir certains attributs de fichier lors de la création d’un fichier. En général, ces attributs sont les plus courants pour une application à utiliser au moment de la création de fichier, mais tous les attributs de fichier possibles ne sont pas disponibles pour CreateFile. Certains attributs de fichier nécessitent l’utilisation d’autres fonctions, telles que SetFileAttributes, DeviceIoControl ou DecryptFile une fois que le fichier existe déjà. Dans le cas de FILE_ATTRIBUTE_DIRECTORY, la fonction CreateDirectory est requise au moment de la création, car CreateFile ne peut pas créer de répertoires. Les autres attributs de fichier qui nécessitent une gestion spéciale sont FILE_ATTRIBUTE_REPARSE_POINT et FILE_ATTRIBUTE_SPARSE_FILE, qui nécessitent DeviceIoControl. Pour plus d’informations, consultez SetFileAttributes.

Comme indiqué précédemment, l’héritage des attributs de fichier se produit lorsqu’un fichier est créé avec des attributs de fichier lus à partir des attributs de répertoire où se trouve le fichier. Le tableau suivant récapitule ces attributs hérités et leur relation avec les fonctionnalités CreateFile .

État de l’attribut d’annuaire Fonctionnalité de remplacement d’héritage CreateFile pour les nouveaux fichiers
FILE_ATTRIBUTE_COMPRESSED défini.
Aucun contrôle. Utilisez DeviceIoControl pour effacer.
FILE_ATTRIBUTE_COMPRESSED pas défini.
Aucun contrôle. Utilisez DeviceIoControl pour définir.
FILE_ATTRIBUTE_ENCRYPTED défini.
Aucun contrôle. Utilisez DecryptFile.
FILE_ATTRIBUTE_ENCRYPTED pas défini.
Peut être défini à l’aide de CreateFile.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED défini.
Aucun contrôle. Utilisez SetFileAttributes pour effacer.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED pas défini.
Aucun contrôle. Utilisez SetFileAttributes pour définir.

Contrôle d’accès

CreateFile

DeviceIoControl

Constantes d’attribut de fichier

Compression et décompression de fichiers

Chiffrement de fichier

Fonctions de gestion de fichiers

Handles et objets

Gérer l’héritage

Ouverture d’un fichier pour la lecture ou l’écriture

SetFileAttributes