Aller au contenu

Répertoires sous Linux⚓︎

Tout est fichier

Sous le système d'exploitation Linux, un fichier est une unité de stockage fondamentale qui contient des données ou des informations. Sont considérés comme fichiers :

  • les fichiers réguliers (images, textes, vidéos, programmes...),
  • les répertoires,
  • les liens,
  • les accès aux périphériques
  • etc...

Autrement dit : « sous Linux, tout est fichier. »

Ainsi, la classe Fichier permet de représenter fichiers réguliers et répertoires.

classDiagram
class Fichier{
       nom: str
       est_repertoire: bool
       liste_fichiers: list
       cree_fichier(nom: str) Fichier
       cree_repertoire(nom: str) Fichier
       est_vide()
       supprime(nom: str)
       affiche()
       vide()
       vide_recursif()
}
  • Chaque fichier est caractérisé par son nom et par un attribut est_repertoire, booléen qui indique si c'est un fichier ou un répertoire.
  • S'il s'agit d'un répertoire, il dispose d'un attribut liste_fichiers qui est la liste des fichiers contenus dans le répertoire.

Un répertoire peut contenir des fichiers réguliers mais aussi d'autres répertoires qui peuvent également contenir des fichiers réguliers ou d'autres répertoires et ainsi de suite...

On présente ci-dessous un extrait de l'arborescence des répertoires sous Linux :

arborescence

Le répertoire / est le répertoire racine.

Code de la classe

On présente ici le code incomplet de la classe Fichier :

🐍 Script Python
class Fichier:
    def __init__(self, nom, est_repertoire):
        self.nom = nom
        self.est_repertoire = est_repertoire
        self.liste_fichiers = None
        if est_repertoire:
            self.liste_fichiers = {}  # dictionnaire vide

    def cree_fichier(self, nom):
        pass

    def cree_repertoire(self, nom):
        pass

    def affiche(self, chaine=""):
        pass

    def est_vide(self):
        pass

    def supprime(self, cible):
        pass

    def vide(self):
        pass

    def vide_recursif(self):
        pass
Définition des méthodes

Pour pouvoir fragmenter l'activité en plusieurs exercices, vous serez amenés à redéfinir une méthode en dehors de la définition de sa classe. Un mécanisme du site permet cette manipulation.

En dehors de cette activité, les méthodes doivent être définies en même temps que le reste de la classe.

Question 1

Dans le cas où un fichier est un répertoire, ses méthodes cree_fichier() et cree_repertoire() permettent respectivement de créer un nouveau fichier ou un nouveau répertoire, à l'intérieur du répertoire initial.

Ainsi le code suivant permet de reproduire cette arborescence :

🐍 Console Python
>>> racine = Fichier("/", True)
>>> etc = racine.cree_repertoire("etc")
>>> home = racine.cree_repertoire("home")
>>> user1 = home.cree_repertoire("user1")
>>> user1.cree_fichier("log.txt")
>>> repertoire_TP = user1.cree_repertoire("TP")
>>> repertoire_TP.cree_fichier("TP1")
>>> repertoire_TP.cree_fichier("TP2")
Compléter les méthodes suivantes qui :

  • prennent en paramètre le nom du fichier à créer,
  • créent ce fichier pour le mettre dans la liste des fichiers du répertoire,
  • et renvoie l'instance de ce fichier :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280139_ 1e5s,/l8:ynb]T60guiokt(2ch[d7}a3mP4.fvpwSF{)=r050F0f0z0I0w0k0h0d0C0k0I0h0h0W010z0w0Q010406050h0v0K0K0I0X0n040S0x0k0v0=0x0o050j0|0~10120`0Q041b1i051l0j1l1n1i0`0F0w0P0*0,0.0:0D0w0u0D0k1B0D0z0^050#0p0k0f1w0-0/011A1C1E1C0z1K1M1I0z0p0x0F121J0X1j0z0D0*150h0Q0I0o0:0B011O1y010O0%0f0o0I0K0f1I1:1=1`1Q1}1M20220^0a0d0L0X0x0Q0x0h0w180o0d0Z1.0X0X0f0C2n1b250o1j0j1,2A0z1*1)1+0F270:1E0o1 2k1I1t1v0+1P2K0w2M0o1$1u1I0Q2t1j2y2A2(0{1;2o2S1{2X0X0 0k0^0d0e2x2,0_2+262.1Q2:2=2@0B2`1=2|2y2J01310I2?040d0J352z0`382 0:3b3d0d0M3h372,393n2@0g3r3j3t3l3a0x2;3c2@0s3y2}2-1x303D323e0G3I3k3L3m3N3F3e0l3R3A3T3C3E3o0b3Z2~3#3v040e0t3*3K2T3$3O0e2_1c2{3z3+3?3-0e343{363}3=2/3V3d0e3g433i3J3u480^0e3q4c3s3~473%4h3x4k454f4o3.3H4r4e3B403Q4x3S3 4g3.3Y4k1k2$1b2Q2D0F2H390C1$231j4M1m4K2*4I4R0Z2%3!3?0y0^2 3r4y3#0R2@4,4D2/0C0^0T0w0C1A0f0X4;4%1{0@040m3y0d560d4-4(0^0Z0O4 4m1Q4/3e5e46280K0^0c0c2V2m5o5j39520A5t3B0p520h0f0k5d4I4=1Q520i3r585G3m0^2X0K5x3#5I5K592/0^0f0h0z0c2t0Q4}0z0x0w2t5R3?520V544r575?5L501Q5z0^5B5D5-1{0x0^0N5 305O0x5Q4k5^5f0:61040W5U5M3a66682(065@575V5`5A5C5E2*6h6d635F5_5N045Y5!5$5(5*5,696p6c0^6f6I6h0o5X5Z5#0f5%0X5)5+0f556n6a5k0:4)040w6t2{6#3u6Q6D6T6F6X640:525;6l6!5@6J015{045}6+366~6w6@6i041E5Z0f0c1}4{0w4}0h6g6z016d6M2(6-3B520U0H3y6m6o6h6(5c775h586y6b3a0O4*2t7c7e4|4~7D6$015v777072775T6N7k6P045P7U0^5:6Z6n6~7Y2X0v0P0f0I0v7d4`7L7j7E7m7^7O7Y4_7f4}7#045w7N6.7Z67815J7W7E0y4@040T3c5B810V7(6}6h7S6s7776844z0^7a0z7J7?7g0X7i8r5S0^0E777+878B5.0^0q7{397`8a7|667-7/7;7K8y7u6|6~6(2t0z0v0X1a8P857,7.7:7=7 7M6l7v568Z5b0f732z6~7B8F7G040C7I6S6U6W6H6u7k7Q8I1{8n5~9b5H0^897o7*6j8i6`3|8Y6O8R8-8U8x808*3B8O9j9q8e9u8;2{6~9a987E8G6k9E6h7V9z7k8c0^0r0X0v6Y9f6^7$8k5?6~9d8{4$7_628F8t0w7b8/7L8A9H7O528E9W787!9_528L9w3#9y6,9k868S8.8V9v8=9p9P0^8#8%8)9O9I9r8T9/8W4x0j4!0f2A2#ap4L1u4N2D2F2B1#1%2D0I1Las0j4M0`aF0!0$0(04.
Question 2

Dans le cas où un fichier est un répertoire, la méthode affiche() permet d’afficher le contenu du répertoire. Si des éléments du répertoire sont eux-même des répertoires, leur contenu est affiché décalé par "--".

🐍 Console Python
>>> racine.affiche()
/
-- etc
-- home
---- user1
------ log.txt
------ TP
-------- TP1.odt
-------- TP2.odt

Compléter la méthode affiche qui :

  • affiche (par la fonction print) le nom du fichier décalé par la chaine de caratères passée en paramètres,
  • si c'est un répertoire, affiche les fichiers qu'il contient, décalés par "--".

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280139_ 1e5s,/l8-:ynb]T60guiokt(2+ch[d7}a3mP4.fvpwSF{)=r050H0f0A0K0x0k0h0d0E0k0K0h0h0Y010A0x0S010406050h0w0M0M0K0Z0o040U0y0k0w0@0y0p050j0~1012140|0S041d1k051n0j1n1p1k0|0H0x0R0,0.0:0=0F0x0v0F0k1D0F0A0`050%0q0k0f1y0/0;011C1E1G1E0A1M1O1K0A0q0y0H141L0Z1l0A0F0,170h0S0K0p0=0C011Q1A010Q0)0f0p0K0M0f1K1=1@1|1S1 1O22240`0a0d0N0Z0y0S0y0h0x1a0p0d0#1:0Z0Z0f0E2p1d270p1l0j1.2C0A1,1+1-0H290=1G0p212m1K1v1x0-1R2M0x2O0p1(1w1K0S2v1l2A2C2*0}1?2q2U1}2Z0Z110k0`0d0e2z2.0{2-282:1S2=2@2_0C2|1@2~2A2L01330K2^040d0L372B0|3a310=3d3f0d0O3j392.3b3p2_0g3t3l3v3n3c0y2?3e2_0t3A2 2/1z323F343g0I3K3m3N3o3P3H3g0l3T3C3V3E3G3q0b3#303%3x040e0u3,3M2V3(3Q0e2{1e2}3B3-3^3/0e363}383 3@2;3X3f0e3i453k3L3w4a0`0e3s4e3u40493)4j3z4m474h4q3:3J4t4g3D423S4z3U414i3:3!4E3$4G4w0e3+4K4o3O4w0C3=4Q484S3Q0C3|2*4u4B4H0C444$4A3.4)4d4,4F4p4Z4l2,1q2(1d2S2F0H2J3b0E1(251l4}1o4{4_2,520#2)4L1}0z0`313t4-3^0T2_5j4=320E0`0V0x0E1C0f0Z5o5e1S0_040n3A0d5G0d5k5f0`0#0Q5z4R0=5m3g5O4X0=0Q0M0`0c0c2X2o5Z5T3b5C0B5(3D0q5C0h0f0k5N4m5J5B0`0i3t5I5p3o0`2Z0M5,3%5C5{4m5}5A5 040f0h0A0c2v0S5x0A0y0x2v633^5C0X5E4t5H6t685P015.0`5:5=6n1}0y0`0P6C32600y62675^0=6E040Y5|6N3c6J6L4$6u5H6T6y046A5?2,5~016P6G5@6*0p0`6c6e6g6i6k6m6M6*6P6R6{696U6b6d6f0f6h0Z6j6l0f5F6Y6v5U015g040x6(2}7d3w6;736@776_7a6.705C6r6X7c6t6!5/5;7j386T6,6H6a1G6d0f0c1 5v0x5x0h6S6|0`6~2*7l3D5C0W0J3A067z6*7g5M7H015R5I7t6w0p0Q5h2v7L7N5w5y7:7e5*7,6#6%7,657S706:0461830`6q7b6Y6T872Z0w0R0f0K0w7M5u7{856w6}8q7e875t7O5x8a045+7}7m886K8z667W6T0z5r040V3e5:8z0X8d6u7A6z7C7,7G8C4B0`7J0A7_8o7P0Z7R8Z640`0G7,8g8F8-6o0`0r8t3b8s6 7;6J8i8k8m7`8*7$7y8J0`2v0A0w0Z1c8~8u908j8l8n8x7|4$7%6Z7)5L0f7D2B6T7.8;7?040E7^7476786`6)7u0`8B9G6w818W8@1}849f8D899O5_048c6s7c8f9h929k8p9R3D8}8I6/5s8)8y9U0=7 9;719T9K7~5`8{3D8K0`0s0Z0w7s9`5)8b8S7(709M6B9@8Ya58!048$8(9l8,af8.048:9@8=6W2}6T5C8`9)3%9+7k9!8E919j949:9n979q049a9c9e9,869#aE9/9m3~9o5G98047+9@9waq9y0K0Q7`a4at6*9?am3^ab9t5d6w9QaO8 9z0F0(2O8X7U7,0h1`0401018Q7w3~aI860q0`2%2X0A8z9Ja,aPa{a}a+7Ea-9|axa:7Baca/6D6F8;6V8Qa89p707g7i9}3%a;a 046-bv6I726?756^798zb8467ya96w7g0Q3FbG410`aFaT387Xay5R2Xb$1}bIadbxaq8#0x7K9%8*albj8rb@bM6a0R3ea3b~bo9H8A9X7xbW8T9-04b)bJbLb 9g04a(a*bhbybl2Xbn9u7T040Db1b3010m0mb69@6p3K0j5b0f2C2%cJ4|1w4~2F2H2D1%1)2F0K1NcM0j4}0|cZ0$0(0*04.
Indice

La définition de la classe Fichier est récursive : un répertoire est un objet de type Fichier qui contient lui-même des objets de type Fichier.

On peut appliquer les méthodes sur l'objet en lui-même, mais aussi sur les objets de type Fichier qu'il contient.

Question 3

La méthode supprime permet de supprimer un fichier dont le nom est passé en paramètre. Par contre, on ne peut supprimer un répertoire que si celui-ci est vide.

🐍 Console Python
>>> user1.supprime('log.txt')
>>> user1.supprime('TP')
"Le répertoire TP n'est pas vide"
>>> racine.affiche()
/
-- etc
-- home
---- user1
------ TP

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280139_ 1e5s,/l8-:ynb]T60guiokt(2+ch[d7}a3mP4.fvpwSF{)=r050H0f0A0K0x0k0h0d0E0k0K0h0h0Y010A0x0S010406050h0w0M0M0K0Z0o040U0y0k0w0@0y0p050j0~1012140|0S041d1k051n0j1n1p1k0|0H0x0R0,0.0:0=0F0x0v0F0k1D0F0A0`050%0q0k0f1y0/0;011C1E1G1E0A1M1O1K0A0q0y0H141L0Z1l0A0F0,170h0S0K0p0=0C011Q1A010Q0)0f0p0K0M0f1K1=1@1|1S1 1O22240`0a0d0N0Z0y0S0y0h0x1a0p0d0#1:0Z0Z0f0E2p1d270p1l0j1.2C0A1,1+1-0H290=1G0p212m1K1v1x0-1R2M0x2O0p1(1w1K0S2v1l2A2C2*0}1?2q2U1}2Z0Z110k0`0d0e2z2.0{2-282:1S2=2@2_0C2|1@2~2A2L01330K2^040d0L372B0|3a310=3d3f0d0O3j392.3b3p2_0g3t3l3v3n3c0y2?3e2_0t3A2 2/1z323F343g0I3K3m3N3o3P3H3g0l3T3C3V3E3G3q0b3#303%3x040e0u3,3M2V3(3Q0e2{1e2}3B3-3^3/0e363}383 3@2;3X3f0e3i453k3L3w4a0`0e3s4e3u40493)4j3z4m474h4q3:3J4t4g3D423S4z3U414i3:3!4E3$4G4w0e3+4K4o3O4w0C3=4Q484S3Q0C3|2*4u4B4H0C444$4A3.4)4d4,4F4p4Z4l4;4L4?3Y0C4s4_4R3W4T4y4 4X514Z4D544v4Z4J594(4T4P5d4.4w0L4V5h4M3Q0L4#3~4-5n3Y0L4+5r4=4Y5u4:5x4`5z3f0L4^5C503_5u4~2}1m2(1d2S2F0H2J3b0E1(251l5R1o5P2,4m055W0#2)5D0=0z0`313t5s1}0T2_5=5y3o0E0`0V0x0E1C0f0Z5`5-010_040n3A0d6c0d5?1S5/040#0Q655J5^3g6l551~0M0`0c0c2X2o6u6p3b680B6z3D0q680h0f0k6k5(5{670`0i3t6e6M0p0`2Z0M6D3%686P4m6R666T040f0h0A0c2v0S630A0y0x2v6X3^680X6a4t6d6~6$5J6F0`6H6J6^1}0y0`0P76326U0y6W6#6f0=78040Y6Q7h3c7d7f4$6 6d7n7204746K2,6M7j7a6L6%0`6*6,6.6:6=6@7g7A0`7l7M7E6)6+6-0f6/0Z6;6?0f6b7s706q6h0x7y2}7%3w7F7T7I7X7K7!7D5J686|7r7$6~7u6G6I7+387n7B7b3o0`1G6+0f0c1 610x630h7m7N7k8i66680W0J3A067~6M6h6j86016n6e7^6q0p0Q5:2v8b8d62648A6A0`6C8K6E80758O6Y6O8l5J6(6V8w6`7{3~7}7n8X0y0w0R0f0K0w8c608I8V6q7j7P2*7-4B5~8;8f8J7z8m8M8w8)7q5N6M6Z8?3b0z5}040V3e6H8Z0`0X7#7s7 73818w858S41880x8a8:8e8g9i040G947p9A0r9a3D8^9H3.7d8+8-8/8H8 8q8%8t0`2v0A0w0Z1c7Q8W9M8,8.9x8=4t068r7t9U6i0f822B7n8y948D040E8F7U7W7Y7L917_939s1}7v7x9A6!8`8(9Ea61S8!9l6 ad042Z9N9)9Q639K3^9J9#8B8}9y909792048Na3aval7eaaar1}9c0`0s0Z0w7@aD8L049k6}7$9n7w9paf7i799D04890A8G8~9zaZ6N9Ba$8Ya-689Gau3batac6S9%9O9*9R9,9T666h9W9Y9!a{7Ram9(9Pa+ay469.6c7n8u9=8w9_a-8C0`0K0Q8HaPaza4aB8wa8aYaQ3D99a^8|9|0F0(2O9q7O8w0h1`0401019A6{ai8s6%0q0`2%2X0A9AaCbuaE61bHbt83988UbD3%by8RbA3%9rb?9taF96b,aAaT7|9m9:7*aI1Sb;9?5,5Jb^b%7.7S7H7V7J7Z9A8#467}bU5J6h0Q3Fc48704apbe2B8{b@6n2Xcr01c6bJ047Cb_2;9u9wcu8ha-cab}9$040R3eaOcMcHag8MbSaUclaja|ctbdcEcGcbbEbqbsb#a$b)2Xb+9@8j0DbLbN010m0mbQa=9j9S9/b30`8va-bmcW3o9{7G0c0R0x0#c:a-cDd1aScj3kb2cn9V0$b6cB0pbWa%21didacC8Qc784a#bncJa)a a,dA6`cE0Y8_c,3%0M0x0`5l3~9-cm7(d6bkd85_bn9{0~0SbY24dzdQ3^dkdLb.b8cQ0E0x1Nc@c86qahc!c$d504c3b/b`d_d{cB0yczb77,aWa9cNdFdA6(a(a*axcVd/1}7`bTaVc%cue9bKe5a7dCc*a$ekdJ0ZencPd~0`9CdG9|d`1O9Ferc1e2e48`cxas6n2Zb!ex7cc(axeAeKdd7;a1d|eU776ncqeZcseuegcFa$dddfdhdl0BcZc0c#d4dq9;0kcBd;eo1ScOc^7ReCcL9AeJei5:eMd|7na?3K0j5*0f2C2%fq5Q1w5S2F2H2D1%1)2F0Kd{2C5R0|0j0#0%0)0h04.
Question 4

La méthode vide permet de supprimer l'ensemble des fichiers d'un répertoire. Par contre, on ne peut supprimer un répertoire que si celui-ci est vide.

🐍 Console Python
>>> home.vide()
"Le répertoire TP n'est pas vide"
>>> racine.affiche()
/
-- etc
-- home
---- user1
------ TP
-------- TP1.odt
-------- TP2.odt

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280139_ 1e5s,/l8éL:ynbR]T60guiàokt(2ch[d7}a3mP4.Efvp;wSF{)=rq050J0f0D0M0z0k0h0d0G0k0M0h0h0$010D0z0V010406050h0y0O0O0M0%0p040Y0B0k0y0|0B0q0d020M0O0V0W0d0s0f160%0(0y0f0h050j13151719110V041x1E051H0j1H1J1E110J0z0U0;0?0^0`0H0z0x0H0k1X0H0D0 050,0r0k0f1S0@0_011W1Y1!1Y0D1*1,1(0D0r0B0J191)0%1F0D0H0;1c0h0V0M0q0`0F011.1U010T0.0f0q1k0f1(292b2g1:2j1,2m0O2o040a0d0P0%0B0V0B0h0z1f1h0*270%0%0f0G2J1x2q0q1F0j252V0D2322240J2s0`1!0q2l2G1(1P1R0=1/2)0z2+0q1 1Q1(0V2O1F2T2V30122a1h2;2h2_0%160k0 0d0e2S3410332r361:383a3c0F3f2b3h2T2(013m0M3b040d0N3q2U113t3k0`3w3y0d0Q3C3s343u3I3c0g3M3E3O3G3v0B393x3c0v3T3i351T3l3Y3n3z0K3%3F3*3H3,3!3z0l3:3V3=3X3Z3J0b3{3j3}3Q040e0w423)2=3~3-0e3e1y3g3U434b450e3p4g3r4i4a373@3y0e3B4o3D3(3P4t0 0e3L4x3N4j4s3 4C3S4F4q4A4J463$4M4z3W4l3/4S3;4k4B463`4X3|4Z4P0e414%4H3+4P0F484-4r4/3-0F4f304N4U4!0F4n4|4T444 4w524Y4I4_4E574(593^0F4L5c4.3?4:4R5i4@5k4_4W5n4O4_4$321K2~1x2/2Y0J2$3u0G1 2y0)1Q1F2}0f2 3g3M055F0*5N5j010C0 3k5P581:0X3c5Z5d3l0G0 0Z0z0G1W0f0%5(5U0~040o3T0d5|0d534b5W040*0T5?5o015$3z653u0T0O0 0c0c2@2I6f6a3W5^0E6k3}0r5^0h0f0k644F5 2h5^0i3M5~5!3H0 2_0O6o4b6z6B6x3l0 1v0D0c2O0V5;0D0B0z2O6I6y0 0#5`4M5}6)6C5)0`6q0 6s6u6Z1:0B0 0R6=6E046G6L6D016@040$6~6,3v6F0B6H6(6*5|6M6-6r6t6v326 716_6w6 0q6O0h6Q6S6U6W6Y4F6+5U71737w7d76046P6R0f6T0%6V6X0f5{7b7x66610z7h3g7P3P7p7r7H7t7L6`015^6%4|7O6*7C6.046:7T3r7C7k7$7o041!7q0f0c2j5/0z5;1w7B7j0 7A307V6l0 0!0L3T066)7C61637$685~7m750q0T5X2O7}7 5:5=8n5@0 6n8x667.7:7$6K848o77797i755^6$7N7b7C7_2_0y0U0f0M0y7~5.8v747y868$667_5-805;8F8z7^8J8/046A8H5U0C5+040Z3x6s8?0#8P7,6 8D7g7$7@8B7W7`0z7|8Z8-0%838L8y040I8;6|788?0t8)3u7z9s4U778U8W8Y8u818w4|8f7O8h0 2O0D0y0%0q9v449x8V8X9f8#4M9F7c6 8i0f7;2U7C8l7^8q040G8s7G7I7K7v9j666m7$966;9a8a8@9O4k8=9{3}8N7)4h7+8R9Q9z9T9C9~2h9u8_8*5,8!aba16J8:ak37a09=3u8G888h8|0u0%1u91938g957f9`aq3W99aF9P9c9e9B828?9man6N9o8K5O6 5^9raf9t8(aY9w9o9y9SaM9D4h9W9475619J9L9Na#aJ8T9R9Aai8.9VaBa/0 8jaQ0`9(b33v9*7F0U0z0*8?8AaI4b9_9#5T9?6#a44pa69Y9I0+a=ac3l0r0 2vbd9^aDbi7?6^9n7{0D8ta|9hazb67z87aU750O0z0 4=9Ea 8`b19!8k5%b68p0 babcb69@b6bh91bm3Dbo8IaS0haaaNa@4baeat7nbvaK0Dbyb,bA98bDb#bw9dbGb^bJbLc6bfao042I1q9ibO9k0E0#92a~9Gbp040T3Ybt6{6}b*0 8^b}b=a*cw70682@cF8S78b@a*ck7=aV0 b/107+bV7Q0 7ScF0B682_c1b`cgcEcd047lcfaR7F7s7J7u7Mc(6?68cvc^6{c*c.0`aHclag7E7q0cb(c@c 7%8z8O7acUa.bW626tcFb-c+c-d29bbFbH9gcO9$cQ9l9ncyd9aW3%0j5R5M1G5y0j5A1x0D5CdI2!2W1~202Y0M1+dDdG5J1Dbj3u2O0O7~0M0C7}0H0N0 1p1r1t1v0dcS1G3h1E0S1h0P0p251g0i0d0.0d0q006P0d2a0:2F0^0zdS0d2L0O2`2j5;0d0y2K5.2J2m7Le52l0J2b0D0d1t001g0d1,e5175F9L0D7l1N1I040n0M0d0h1c1e0zex2}2E2G0m1-5.0z0de42L9,eU0%ei2+eyc91-5F0qbG2me.eyd/eC0V1,0:5Q5G040E6Gd~a*cpdC3z0J0yeceleP0qen2OeYet2L2a0%eC0%6X0;0+bGe*7|eFd?040P0B9LeyeKe#5;d~exeKeO7{0mfw0d0O0md|2Le{5Sci0Ocn1xf3d~eR5L0d0A2Bd{0Hd}fH0-0:fB9L0-et0m0x3x1q2let0Vf6fD9deheje,1g7qax2Qf9eAe%5F1l0%0m0H2l2Hex6%eG2/3u1=1Z1#1%dX3W2u2l2n0 2A0Y9,0}etd`d|a?325Lbj315Of3a7b?cbds698572cF5^0Ibedna$dxgPa2cAdjc4dlbEe+gGaOdw9pcz040tcpcCdgcua+3r89a^g%g,66c!cXgx7U7-gWd9d1cPb=dpg!g(aX52dBe|dEdT5A11dG0+0-0/04.
Question 5

La méthode vide_recursif permet de supprimer l'ensemble des fichiers d'un répertoire. Si, parmi ces fichiers, un répertoire n'est pas vide, il est à son tour vidé avant d'être supprimé, et ainsi de suite...

🐍 Console Python
>>> home.vide_recursif()
>>> racine.affiche()
/
-- etc
-- home

Compléter le code de la classe.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013_ 1e5s,/l:ynb]6guiokt(2ch[d7a3mP4.fvpwS)=r050B0e0v0D0s0j0g0c0y0j0D0g0g0P010v0s0L010406050g0r0F0F0D0Q0l040N0t0j0r0+0t0m050i0=0@0_0{0:0L04141b051e0i1e1g1b0:0B0s0K0Z0#0%0)0z0s0q0z0j1u0z0v0.050U0n0j0e1p0$0(011t1v1x1v0v1D1F1B0v0n0t0B0{1C0Q1c0v0z0Z0~0g0L0D0m0)0x011H1r010J0W0e0m0D0F0e1B1)1+1:1J1?1F1_1{0.0a0c0G0Q0t0L0t0g0s110m0c0S1%0Q0Q0e0y2g141~0m1c0i1#2t0v1Z1Y1!0B200)1x0m1^2d1B1m1o0!1I2D0s2F0m1V1n1B0L2m1c2r2t2X0;1*2h2L1;2Q0Q0^0j0.0d2q2#0/2!1 2%1J2)2+0.0x2/1+2;2r2C012_0D2,040E2}2s0:302@0)33350H382 2#313e0.0f3h3a3j3c320t2*340.0p3o2=2$1q2^3t2`040C3h1d2V142J2w0B2A310y1V1|1c3L1f3J2Z152:053Q0S2W3q3B0)0u0.0S0J3H3b3)010M0.0c3/3(2M320J0.0K0s0S0b2m0y0r0Q2e3.3Y2~3z310-040w3_2?3;0n4d0g0e0j482Z3:3{4d0O0k3o0c4w3^4q2(0.2Q0F0g0b1?0y1t0e463h4y3`1;0t0.0P4L4b3r0m0n0.1x0g0v4g3A4r0.4f492s4T4i4k4m4o3Z4z1J4P040I4#3k4X0s4Z0e4F0s4H0s4J0g4`3r4@4_4*3%4h3{0m0.2f0e4D563;4d0w0O0O4v4x4,3{3+040J3t4S4=3d4B0t0F5j4%040h5x4N2^0.4G4I0Q5H5c4O3?042O5O4$4A044C4E5L534K5a5r1;4d4u5a064x5.4M5P1J5t0s4:2~5:5V5J5u515M5D4O0.594p5I5z040e4Z420e0L4J0v0t0s2m601J5*5p5/5/5(5|5!4J6i0)586s323~404 4345476v5l5o5,5-6m5`315t0S0j5U314j0.4l4n6v6u5%5y6w044Y0v4 6q5$645;0)4d0A6v5e5X5B6D0.0o3y0i3#0e2t2U6{3K1n3M2w2y2u1U1W2w0D1E6~0i3L0:7b0T0V0X04.