Accès fichier Préparer par khadija lahmadi Tdi group a Accès aux fichiers L’esp
Accès fichier Préparer par khadija lahmadi Tdi group a Accès aux fichiers L’espace de noms System.IO contient un certain nombre de classes permettant d’effectuer des opérations sur des fichiers. Ces différentes classes peuvent être regroupées en diverses catégories : • la classe DriveInfo pour fournir des informations sur une unité de disque ; • les classes Directory et DirectoryInfo pour manipuler des répertoires (créer un sousrépertoire, connaître les répertoires et fichiers d’un répertoire donné, etc.) ; • les classes File et FileInfo qui fournissent des informations sur un fichier et permettent diverses manipulations (suppression, changement de nom, copie, etc.) mais sans permettre de lire ou d’écrire des fiches de ce fichier (sauf en version 2 pour la classe File qui contient maintenant quelques fonctions d’accès aux données d’un fichier) ; • les classes Stream et apparentées qui traitent les flots de données et permettent de lire et d’écrire dans le fichier. Dans ce chapitre, nous ne nous intéresserons qu’aux fichiers simples (de texte ou non) et pas encore aux bases de données à la fois plus complexes et plus faciles à manipuler (la facilité grâce aux techniques d’accès ADO.NET, voir le chapitre 24). À la suite de l’accès aux fichiers, nous étudierons la sérialisation et la désérialisation. Nous nous préoccuperons aussi des différents types d’encodage, ce qui nous permettra de lire et de créer des fichiers de texte provenant de n’importe quel système et de n’importe quelle partie du globe. 23.1 La classe DriveInfo La classe DriveInfo fournit des informations sur une unité de disque : nom d’étiquette (volume label en anglais), capacité, espace disponible, etc. L’unité de disque (par exemple A:) est passée en argument du constructeur. Le constructeur de la classe accepte en argument un nom d’unité (a à z ou A à Z). Les : à droite de la lettre de l’unité sont autorisés. Pour déterminer le pourcentage d’espace libre sur disque : using System.IO; ..... DriveInfo di = new DriveInfo("C:"); long ts=di.TotalSize, afs=di.AvailableFreeSpace; double pc = (double)afs/ts*100; Le transtypage sur afs est nécessaire pour qu’une division réelle soit effectuée entre afs et TotalSize. On aurait aussi pu écrire 100.0*afs/ts. 23.2 Les classes Directory et DirectoryInfo Les classes Directory et DirectoryInfo donnent des informations sur le contenu d’un répertoire et permettent d’effectuer des opérations comme créer un sous-répertoire. La classe Directory ne contient que des méthodes statiques tandis que les méthodes de la classe DirectoryInfo opèrent sur un objet de cette classe. Classe DriveInfo DriveInfo ← Object using System.IO; Propriétés de la classe DriveInfo AvailableFreeSpace long Espace (en nombre d’octets) encore disponible sur l’unité. DriveFormat str Type de disque : NTFS ou FAT32. DriveType Type d’unité : une des valeurs de l’énumération DriveType : CDRom, Fixed, Network, NoRootDirectory, Ram, Removable ou Unknown. IsReady T/F Indique si l’unité est prête à l’emploi : DriveInfo di = new DriveInfo("A:"); di.IsReady vaut true si l’unité de disquette est prête à l’emploi. Name str Nom de l’unité (par exemple C:) RootDirectory De type DirectoryInfo, cette propriété donne des informations sur le répertoire racine. TotalSize long Capacité de l’unité. VolumeLabel str Étiquette de volume de l’unité. Cette propriété peut être modifiée, et cette modification est répercutée sur le disque. L’exception SecurityException est générée si l’utilisateur n’a pas le droit de modifier l’étiquette de volume Pour afficher les fichiers (nom et date de création) du répertoire courant : using System.IO; ..... string curDir = Directory.GetCurrentDirectory(); DirectoryInfo cdi = new DirectoryInfo(curDir); foreach (FileInfo fi in cdi.GetFiles()) Console.WriteLine(fi.Name + " – " + fi.CreationTime.ToString("d")); 23.3 Les classes File et FileInfo Les classes File et FileInfo permettent d’effectuer des opérations sur des fichiers (mais pas encore l’accès aux données contenues dans le fichier). La classe File ne contient que des méthodes statiques tandis que la classe FileInfo associe un objet (de type FileInfo) à un fichier et les méthodes de FileInfo opèrent sur cet objet. Elles fournissent diverses informations (taille du fichier, droits d’accès, etc.) sur un fichier. Depuis la version 2, la classe File fournit quelques fonctions d’accès aux données du fichier. Name str Nom du répertoire. Parent Directory Répertoire père. Méthodes de la classe DirectoryInfo DirectoryInfo CreateSubDirectory(string rep); Crée un sous-répertoire de l’objet DirectoryInfo sur lequel porte l’opération. void Delete(bool recursive); Supprime le répertoire sur lequel porte l’opération. recursive doit valoir true pour supprimer les sous-répertoires et fichiers de ce répertoire. Si recursive vaut false et que des fichiers existent dans le répertoire que l’on veut supprimer, une exception est générée. void Delete(); Comme la fonction précédente mais avec l’argument recursive qui vaut systématiquement true. DirectoryInfo[] GetDirectories(); Renvoie un tableau des sous-répertoires (objets DirectoryInfo) du répertoire sur lequel porte l’opération. DirectoryInfo[] GetDirectories(string pattern); Même chose mais permet de spécifier un critère de sélection. FileInfo[] GetFiles(); Renvoie un tableau des fichiers du répertoire sur lequel porte l’opération. FileInfo[] GetFiles(string pattern); Même chose mais permet de spécifier un critère de recherche. void MoveTo(string repDest); Change le nom de répertoire du répertoire sur lequel porte l’opération. Si aucune exception n’est générée, il s’appellera dorénavant repDes Pour renommer un fichier (Anc.jpg qui doit devenir Nouv.jpg), on écrit (en vérifiant que Anc.jpg existe bien) : using System.IO; ..... FileInfo f = new FileInfo("Anc.jpg"); if (f.Exists) f.MoveTo("Nouv.jpg"); L’exception IOException est générée si un fichier s’appelant Nouv.jpg existe déjà. L’exception UnauthorizedAccessException est générée si le fichier est déplacé sur une autre unité. 23.4 La classe Stream et ses classes dérivées Nous allons maintenant nous intéresser au contenu des fichiers. 23.4.1 La classe abstraite Stream Un flot (ou flux, stream en anglais) désigne une suite continue d’octets s’écoulant d’une source vers une destination. La source (source en anglais) et la destination (sink) concernent généralement mais pas nécessairement des fichiers. Il pourrait en effet s’agir de transferts de données sur le réseau ou en mémoire. Les opérations d’entrée/sortie sont essentiellement régies par la classe Stream (une classe abstraite qui sert de base notamment à la classe FileStream) et quelques classes associées (classes reader et writer). La classe Stream est une classe abstraite (on ne peut donc pas créer d’objet de cette classe) qui est à la base des autres classes susceptibles d’être utilisées pour lire et écrire des données. Ces classes dérivées de Stream sont : • FileStream pour les accès aux fichiers ; • NetworkStream pour les accès au réseau (transfert de données à travers le réseau) ; • MemoryStream pour des échanges entre zones de mémoire ; • mais aussi BufferedStream et CryptoStream. La classe BufferedStream fait intervenir la notion de buffer (c’est-à-dire de zone tampon en mémoire) dont on peut spécifier la taille. Jouer sur la taille du buffer a souvent une influence sur les performances (dans un sens ou dans l’autre, tant cela dépend de nombreux facteurs). Un objet BufferedStream est construit à partir : • d’un objet d’une des autres classes (FileStream, etc.), objet spécifié en premier argument du constructeur ; • d’une taille de buffer spécifiée en second argument. Un objet CryptoStream utilise aussi les méthodes de lecture et d’écriture de Stream mais permet de crypter les données. Un objet CryptoStream est construit à partir : • d’un objet d’une des autres classes spécifié en premier argument ; • d’informations de cryptage en deuxième et troisième arguments. Si nous avons créé un objet FileStream, c’est en vue d’effectuer des lectures, des ajouts et des modifications de données dans ce fichier. Nous allons pour cela utiliser les classes : • StreamReader et StreamWriter pour les fichiers de texte ; • BinaryReader et BinaryWriter pour les fichiers binaires. Ces classes donnent en effet accès aux données plus aisément qu’avec les méthodes Read et Write de la classe FileStream. Un fichier de texte ne peut contenir que du texte, y compris les caractères de saut de ligne. C’est notamment le cas des fichiers créés à l’aide du bloc-notes. Les fichiers créés à l’aide d’un logiciel de traitement de texte ne sont pas des fichiers de texte puisqu’ils contiennent bien autre chose en plus du texte et des marques de saut de ligne. 23.5 Les classes de lecture/écriture 23.5.1 La classe StreamReader Différentes méthodes des classes StreamReader, StringReader et BinaryReader permettent de lire plus aisément dans un flot (c’est-à-dire dans un objet d’une classe dérivée de Stream) que ne le permettent les méthodes de la classe Stream. De même, différentes méthodes des classes StreamWriter, StringWriter et BinaryWriter permettent d’écrire dans un flot. La classe StreamReader est spécialisée dans la lecture de fichier de texte. Elle permet notamment de lire un fichier de texte ligne par ligne. Elle permet également de spécifier FileStream( string nomFichier, FileMode, FileAccess, FileShare) Comme le constructeur précédent mais un mode de partage est spécifié. File- Share peut prendre l’une des valeurs suivantes de l’énumération FileShare : None aucun partage autorisé, Read les autres utilisateurs peuvent lire dans le fichier mais ne peuvent y écrire, ReadWrite les autres utilisateurs peuvent lire et écrire dans le fichier (à charge pour eux aussi d’effectuer les verrouillages nécessaires pour éviter les problèmes d’accès concurrents), Write les autres utilisateurs peuvent modifier le fichier. Méthodes propres à la classe FileStream void Lock(long pos, uploads/Litterature/ acces-fichier.pdf
Documents similaires







