TP 05 - Systèmes de fichiers

Pour ce TP on va travaille avec la machine virtuelle Linux et avec le Micro:bit, aussi, pour réaliser des opérations avec le système de fichiers.

Fichiers. Systèmes de fichiers

Le fichier est l’une des abstractions fondamentales dans le domaine des systèmes d’exploitation; L'autre abstraction est le processus. Si le processus résume l'exécution d'une tâche spécifique sur le processeur, le fichier résume les informations persistantes d'un système d'exploitation. Un fichier est utilisé pour stocker les informations nécessaires au fonctionnement du système d'exploitation et aux interactions de l'utilisateur.

Un système de fichiers est un moyen d'organiser les fichiers et de les présenter à l'utilisateur. Du point de vue de l'utilisateur, un système de fichiers a une structure hiérarchique de fichiers et de répertoires, commençant par un répertoire racine. L'emplacement d'une entrée (fichier ou répertoire) est défini par un chemin qui répertorie toutes les entrées jusque-là. Ainsi, pour le chemin /usr/local/file.txt , le répertoire racine / contient un sous-répertoire usr qui comprend le sous-répertoire local contenant un fichier file.txt.

Chaque fichier est donc associé à un nom identifiant, à un ensemble de droits d'accès et à des zones contenant des informations utiles.

Les systèmes de fichiers pris en charge par les systèmes d'exploitation Unix et Windows sont hiérarchiques. Les systèmes Linux / Unix sont sensibles à la casse (Données est différent de données) et les systèmes Windows ne font pas la distinction entre les casses.

La hiérarchie du système de fichiers Unix comporte un seul répertoire appelé racine et / dans lequel n’importe quel fichier est localisé (à ne pas confondre avec le répertoire ”/ racine”, qui est: patrie de privilegiat, root). La liste des chemins de fichiers Unix est une chaîne de noms de répertoires séparés par '/' , suivis du nom du fichier. Il existe également des chemins relatifs au répertoire en cours '.' Ou au répertoire parent '..'.

Sous Unix, il n'y a pas de différence entre les fichiers du disque local, du CD ou du lecteur réseau. Tous ces fichiers feront partie de la hiérarchie unique du répertoire racine. Cela se fait par 'mount': les systèmes de fichiers seront montés dans l'un des répertoires du système de fichiers racine.

Il existe plusieurs hiérarchies dans Windows, une pour chaque partition et une pour chaque emplacement réseau. Contrairement à Unix, le délimiteur entre les noms de répertoire dans un chemin et pour les chemins absolus, la hiérarchie doit être spécifiée sous la forme C: \ , E: \ ou \\FILESERVER\myFile (pour le réseau). Comme Unix, Windows utilise . Pour le répertoire actuel et '..' pour le répertoire parent.

Systèmes de fichiers Micro:bit

Le système de fichiers sur Micro:bit se résume à un répertoire racine qui contient tous les fichiers du dispositif.

Étant un système plus simple, sans utilisateurs, les fichiers sur Micro:bit n'ont pas de détails adjacents, à l'exception de la taille.

Opérations sur les fichiers

Sous Unix, un descripteur de fichier est un ensemble qui indexe une table avec des pointeurs sur des structures décrivant les fichiers ouverts par un processus. Si un programme est exécuté dans un shell Unix, le processus parent (shell) ouvre pour le processus enfant (le programme) 3 fichiers standard avec des descripteurs de fichier de valeur spéciaux:

 Descripteurs de fichiers standard

  • standard input (0) - lecture à partir d'une entrée standard (clavier)
  • standard output (1) - affichage sur la sortie standard (console)
  • standard error (2) - affichage sur la sortie d'erreur standard (console)

Un fichier associe le pointeur de fichier qui indique la position actuelle dans le fichier. Le curseur de fichier est un entier représentant le déplacement (décalage) du début du fichier.

Opérations spécifiques pour travailler avec des fichiers:

  • ouverture / création d'un fichier - signifie associer un descripteur de fichier identifié par son nom (fopen (ANSI C), open, creat (POSIX), CreateFile (Win32 API))). ( Linux)
  • fermer un fichier - signifie libérer les structures de fichier associées au processus et au descripteur de ce fichier - uniquement s’il n’ya pas d’entrée dans la table des descripteurs fichier qui pointe vers cette structure (fclose (ANSI C), close (POSIX), CloseHandle (Win32 API)). ( Linux)
  • lecture dans un fichier - signifie copier un bloc de données dans une mémoire tampon; après la lecture est mis à jour le curseur de fichier (fread (ANSI C), read (POSIX), ReadFile (Win32 API)). ( Linux)
  • écriture dans un fichier - signifie copier un bloc de données d'un tampon dans un fichier; Ecrire signifie aussi mettre à jour le curseur de fichier (fwrite (ISO C), write (POSIX), WriteFile (Win32 API)). ( Linux)
  • positionnement dans un fichier - signifie changer la valeur du curseur de fichier; les lectures ou écritures suivantes commenceront à l'emplacement indiqué par ce curseur de fichier (fseek (ANSI C), lseek (POSIX), SetFilePointer (Win32 API)). ( Linux)
  • changer les attributs d'un fichier - signifie définir les paramètres du fichier ( fcntl (POSIX), SetFileAttributes (Win32 API)). ( Linux)

Opérations avec les fichiers sur Micro:bit

Pour manipuler des fichiers en utilisant MicroPython pour Micro:bit, on a le module os avec un ensemble de fonctions qui permettent de lire / écrire des fichiers.

En utilisant le module os on peut utiliser les fonctions suivantes:

  • os.listdir() - renvoie une liste des noms de fichiers stockés sur le dispositif
  • os.remove(filename) - supprimer le fichier avec le nom filename
  • os.size(filename) - renvoie la taille en bytes du fichier avec le nom filename

En plus, nous avons les éléments suivants à notre disposition fonctions pour manipuler les fichieres:

  • open(filename, mode='r') - renvoie un objet représentant le fichier avec le nom filename; le parametre mode spécifie les permissions que nous avons sur le fichier: 'r'-read, 'w'-write
  • close() - ferme le fichier ouvert en avance
  • name() - renvoie le nom du fichier
  • read(size) - lit et renvoie au plus size caractères; si size manque ou a la valeur -1, on va lire le fichier entier.
  • readinto(buf, n=-1) - lire n caractères dans la variable buf
  • readline(size) - lit une ligne du fichier; si n est donné comme paramètre, on va lire maximum n caractères
  • write(buf) - écrit le contenu du buf dans le fichier et renvoie le nombre de caractères écrits.

Exemple

import os
 
#open the file for writing
f = open ("my_file", 'w')
#write text to file
count = f.write ("My awesome text")
#print how many characters were written
print ("{} characters were written to file".format(count))
f.close()
#read text from file and print it
f = open ("my_file", "r")
text = f.read()
print (text)
 
#delete the file
os.delete("my_file")
#list all remaining files
files = os.listdir()
print (files)

Exercices

  1. Liste les fichiers stockés sur Micro:bit.
  2. Créez un fichier appelé student qui contient votre nom et votre groupe. Affichez la nouvelle liste de fichiers.
  3. Afficher tous les fichiers du Micro:bit avec leur taille.
  4. Créez un programme qui stocke la valeur de température dans un fichier toutes les 10 secondes.
  5. Créez un programme qui lit la valeur du capteur de lumière toutes les 10 secondes et stocke la valeur dans un fichier si seulement si cette valeur est différente du moins 20 unités en comparaison avec la valeur précédente.
  6. Créez un programme qui en appuyant le butons a, va créer un nouveau fichier sur Micro:bit (le nomes des fichiers vont avoir la forme file_0,file_1 etc.). En appuyant le butons b, le programme va effacer les fichiers commencent avec le dernier fichier créé. En résolvant l'exercice, ne stockez pas la liste des fichiers créés, ils seront lus directement à partir de Micro:bit.

Opérations sur les fichiers sous Linux

Pour pouvoir utiliser les fonctions de manipulation de fichiers en Python, nous allons importer la bibliothèque os du Python.

import os

Création, ouverture, fermeture et suppression des fichiers

ouverture

Pour ouvrir / créer un fichier, utilisez la fonction open.

os.open(path, flags);               # ouverture 
os.open(path, os.O_CREAT|flags, mode);  # creation 

Les valeurs possibles pour flags sont:

  • os.O_RDONLY ouverture seulement pour la lecture
  • os.O_WRONLY ouverture uniquement pour l'écriture
  • os.O_RDWR ouverture pour la lecture et l'écriture
  • os.O_NONBLOCK ne bloque pas l'ouverture ni la disponibilité des données
  • os.O_APPEND ajouter à chaque écriture
  • os.O_CREAT crée un fichier s'il n'existe pas
  • Taille tronquée os.O_TRUNC à 0
  • Erreur os.O_EXCL et * os.O_CREAT si le fichier existe
  • os.O_SHLOCK obtenir atomiquement un verrou partagé
  • os.O_EXLOCK obtient atomiquement un verrou exclusif
  • os.O_NOFOLLOW ne suit pas les liens symboliques
  • os.O_SYMLINK autorise l'ouverture de liens symboliques
  • Le descripteur os.O_EVTONLY est demandé pour les notifications d'événement uniquement
  • os.O_CLOEXEC marque comme proche-sur-exec

Les valeurs des indicateurs sont représentées par des bits, car elles peuvent être combinées par l'opérateur | (ou sur des bits).

# open a file in write only and delete all its contents (truncate to 0)
os. open(pathname, os.O_WRONLY | os.O_TRUNC, mode);

La valeur de mode est représentée par les droits du nouveau fichier créé (en bits). Généralement, un nombre de base de 8 est utilisé. Il a trois chiffres, chacun avec trois bits.

r w x r - x r - -
1 1 1 1 0 1 1 0 0
7 5 4
  • r - read
  • w - write
  • x - execute

Chaque chiffre se réfère à:

  • premier chiffre - permissions de l'utilisateur qui détient le fichier
  • deuxième chiffre - permissions du groupe contenant le fichier
  • troisième chiffre - les autorisations des utilisateurs qui ne possèdent pas le fichier et ne font pas partie du groupe qui détient le fichier

fermeture

La fermeture des fichiers se fait avec close:

os.close(fd)

La suppression effective d'un fichier du disque se fait avec unlink:

os.unlink(pathname);

Toutes les fonctions de la bibliothèque os lèvent une exception si l'opération de peuts pas etre effectuée avec succès. Pour traiter ces exceptions, on va utiliser la construction try - except.

Exemple

Si, par exemple, nous voulons ouvrir le fichier in.txt pour la lecture et l'écriture, éventuellement le créer, et le fichier out.txt pour l'écriture, avec des troncatures, nous pouvons utiliser la séquence de code suivante:

import os
 
try:
	fd1 = os.open("in.txt", os.O_RDWR | os.O_CREAT, 0644)
 
	# will fail if out.txt does not exist 
	fd2 = os,open("out.txt", os.O_WRONLY | os.O_TRUNC)
 
	os.close(fd1)
 
        os.close(fd2)
 
except Exception as e:
        print ("Error: {}".format (e))

Attention Une erreur courante est l'omission des droits de création de fichier (0644 dans l'exemple ci-dessus) lorsque l'indicateur O_CREAT ouvert est appelé.

Positionnement dans un fichier (lseek)

lseek

La fonction lseek permet le déplacement du curseur du fichier vers une position absolue ou relative.

 os.lseek(fd, offset, whence)

Le paramètre “wheece” représente la position relative à partir de laquelle le déplacement est effectué:

  • os.SEEK_SET - contre la position de départ
  • os.SEEK_CUR - à la position actuelle
  • os.SEEK_END - vers la position finale

Remarque lseek permet également le positionnement à la fin du fichier. L'écriture dans de telles zones n'est pas perdue, ce qui est obtenu en étant un fichier void , une zone ignorée - n'est pas allouée au disque.

Troncature des fichiers

Outre la troncature à 0, ce qui peut être fait en appelant open avec l'indicateur O_TRUNC , vous pouvez spécifier de tronquer un fichier à une taille spécifiée par des appels système ftruncate et truncate:

os.ftruncate(fd, length)      
os.truncate(path, length)

Dans le cas de ftrunched, le paramètre fd est le fichier descripteur obtenu avec un appel ouvert fournissant l'autorisation d'écriture. Dans le cas de truncate, le fichier représenté par chemin doit avoir le droit d'écriture.

Exemple d'utilisation des opérations d'E / S

 
import os
 
# Print the last 100 bytes from a file
 
try:
    # open file 
    fd = os.open("file.txt", os.O_RDONLY)
 
    # set file pointer at 100 characters _before_ the end of the file
    rc = os.lseek(fd, -100, os.SEEK_END)
 
    # read the last 100 characthers 
    msg = os.read(fd, 100)
    bytes_read = len(msg)
 
    print ("the last " + bytes_read + " bytes")
    print (buf.decode("utf-8"))
 
    # close file
    os.close(fd)
except Exception as e:
    print ("Error: {}".format (e))

Exercices

Pour resoudre le TP on va utliser le repository du github. Pour télécharger le repository, exécutez la commanded git clone https://github.com/UPB-FILS-SdE2/sde dans le terminal.

Exercice 2 - read-write (3p)

Allez dans le fichier read-write.py.

2a. Écrivez votre nom (1p)

Mettez votre nom dans la variable name. Écrivez la variable à l'écran en utilisant uniquement la fonction write. Suivez les lignes avec TODO 1.

2b. Lisez votre nom (1p)

Lisez votre nom depuis le clavier dans la variable name en utilisant uniquement la fonction read.

Ecrivez le nouveau nom sur l'écran en utilisant uniquement les fonctions write.

Suivez les lignes avec TODO 2.

2c. Redirection de la sortie standard (1p)

Ecrivez votre nom dans le fichier output.txt en utilisant la fonction print.

Dirigez la sortie standard.

Lors de la création d'un nouveau fichier, vous devez définir le mode du fichier (le troisième paramètre de la fonction open ). Le mode le plus commun est 0644.

Suivez les lignes avec TODO 3.

Exercice 3 - mcat (2p)

Allez dans le répertoire 4-mcat .

3a. Similarité de chat (1p)

Remplissez le fichier pour que le programme mcat résultant ait une fonctionnalité similaire à celle de 'cat' (suivez les commentaires avec TODO 1 )

Le programme 'mcat' recevra comme argument de ligne de commande le nom d'un fichier dont il affichera le contenu à la sortie standard. Vous ne pouvez pas lire le fichier entier en mémoire. Vous ne pouvez lire que des morceaux de taille maximale BUFSIZE.

Vérifiez le code d'erreur renvoyé par les appels système. Passez en revue les sections Création, ouverture et fermeture de fichiers et Écriture et lecture de fichiers.

Testez avec une commande comme:

python3 mcat.py Makefile 

3b. Similarité cp (1p)

Étendez la fonctionnalité de sorte que la sortie soit redirigée vers un fichier reçu en tant que deuxième argument - une fonctionnalité similaire à l'utilitaire cp . (suivez les commentaires avec TODO 2 )

Consultez la section redirections.

Tester la fonctionnalité:

python3 mcat.py Makefile out ; python3 mcat.py out  

Exercice 4 - Hiérarchie des fichiers

Créez un programme python qui affiche la hiérarchie des fichiers et des répertoires à partir du répertoire courant de la même manière que la commande tree . Pour différencier les fichiers des répertoires, le signe + sera placé devant les répertoires, et le signe - sera placé devant les fichiers.

Exemplu:

-main.py
+dir
--file
-+dir2
----file
-Makefile

Solutions

Ressources utiles

  1. Low level I/O (info libc “Low-Level I/O”)
  2. Duplicating descriptors (info libc “Duplicating Descriptors”)
  3. Low level I/O (Advanced Linux Programming)
sde2/laboratoare/04_microbit_fr.txt · Last modified: 2021/04/06 20:45 by ioana_maria.culic
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0