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

.128013s3o_8bcdufvg/T0ly n7apS.r1Fme,(P2=4:}twki9][5h{)6050i0D0M0v0P0q0b0s0h0q0v0b0b0I010M0P0w010406050b0j0C0C0v0z0r040x0d0q0j0=0d0t050n0|0~10120`0w041b1i051l0n1l1n1i0`0i0P0l0*0,0.0:0U0P0m0U0q1B0U0M0^050#0g0q0D1w0-0/011A1C1E1C0M1K1M1I0M0g0d0i121J0z1j0M0U0*150b0w0v0t0:0H011O1y010k0%0D0t0v0C0D1I1:1=1`1Q1}1M20220^0a0s0G0z0d0w0d0b0P180t0s0Z1.0z0z0D0h2n1b250t1j0n1,2A0M1*1)1+0i270:1E0t1 2k1I1t1v0+1P2K0P2M0t1$1u1I0w2t1j2y2A2(0{1;2o2S1{2X0z0 0q0^0s0A2x2,0_2+262.1Q2:2=2@0H2`1=2|2y2J01310v2?040s0c352z0`382 0:3b3d0s0J3h372,393n2@0T3r3j3t3l3a0d2;3c2@0X3y2}2-1x303D323e0u3I3k3L3m3N3F3e0f3R3A3T3C3E3o0Q3Z2~3#3v040A0p3*3K2T3$3O0A2_1c2{3z3+3?3-0A343{363}3=2/3V3d0A3g433i3J3u480^0A3q4c3s3~473%4h3x4k454f4o3.3H4r4e3B403Q4x3S3 4g3.3Y4k1k2$1b2Q2D0i2H390h1$231j4M1m4K2*4I4R0Z2%3!3?0O0^2 3r4y3#0N2@4,4D2/0h0^0B0P0h1A0D0z4;4%1{0@040K3y0s560s4-4(0^0Z0k4 4m1Q4/3e5e46280C0^0e0e2V2m5o5j39520F5t3B0g520b0D0q5d4I4=1Q520E3r585G3m0^2X0C5x3#5I5K592/0^0D0b0M0e2t0w4}0M0d0P2t5R3?520W544r575?5L501Q5z0^5B5D5-1{0d0^0y5 305O0d5Q4k5^5f0:61040I5U5M3a66682(065@575V5`5A5C5E2*6h6d635F5_5N045Y5!5$5(5*5,696p6c0^6f6I6h0t5X5Z5#0D5%0z5)5+0D556n6a5k0:4)040P6t2{6#3u6Q6D6T6F6X640:525;6l6!5@6J015{045}6+366~6w6@6i041E5Z0D0e1}4{0P4}0b6g6z016d6M2(6-3B520V0L3y6m6o6h6(5c775h586y6b3a0k4*2t7c7e4|4~7D6$015v777072775T6N7k6P045P7U0^5:6Z6n6~7Y2X0j0l0D0v0j7d4`7L7j7E7m7^7O7Y4_7f4}7#045w7N6.7Z67815J7W7E0O4@040B3c5B810W7(6}6h7S6s7776844z0^7a0M7J7?7g0z7i8r5S0^0S777+878B5.0^0R7{397`8a7|667-7/7;7K8y7u6|6~6(2t0M0j0z1a8P857,7.7:7=7 7M6l7v568Z5b0D732z6~7B8F7G040h7I6S6U6W6H6u7k7Q8I1{8n5~9b5H0^897o7*6j8i6`3|8Y6O8R8-8U8x808*3B8O9j9q8e9u8;2{6~9a987E8G6k9E6h7V9z7k8c0^0o0z0j6Y9f6^7$8k5?6~9d8{4$7_628F8t0P7b8/7L8A9H7O528E9W787!9_528L9w3#9y6,9k868S8.8V9v8=9p9P0^8#8%8)9O9I9r8T9/8W4x0n4!0D2A2#ap4L1u4N2D2F2B1#1%2D0v1Las0n4M0`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

.128013s3o_8bcdufvg/T0ly n7apS.r1F-me,(P2=4:}+twki9][5h{)6050i0E0O0v0R0q0b0s0h0q0v0b0b0J010O0R0w010406050b0j0D0D0v0z0r040x0d0q0j0@0d0t050n0~1012140|0w041d1k051n0n1n1p1k0|0i0R0l0,0.0:0=0W0R0m0W0q1D0W0O0`050%0g0q0E1y0/0;011C1E1G1E0O1M1O1K0O0g0d0i141L0z1l0O0W0,170b0w0v0t0=0I011Q1A010k0)0E0t0v0D0E1K1=1@1|1S1 1O22240`0a0s0H0z0d0w0d0b0R1a0t0s0#1:0z0z0E0h2p1d270t1l0n1.2C0O1,1+1-0i290=1G0t212m1K1v1x0-1R2M0R2O0t1(1w1K0w2v1l2A2C2*0}1?2q2U1}2Z0z110q0`0s0A2z2.0{2-282:1S2=2@2_0I2|1@2~2A2L01330v2^040s0c372B0|3a310=3d3f0s0K3j392.3b3p2_0V3t3l3v3n3c0d2?3e2_0Z3A2 2/1z323F343g0u3K3m3N3o3P3H3g0f3T3C3V3E3G3q0S3#303%3x040A0p3,3M2V3(3Q0A2{1e2}3B3-3^3/0A363}383 3@2;3X3f0A3i453k3L3w4a0`0A3s4e3u40493)4j3z4m474h4q3:3J4t4g3D423S4z3U414i3:3!4E3$4G4w0A3+4K4o3O4w0I3=4Q484S3Q0I3|2*4u4B4H0I444$4A3.4)4d4,4F4p4Z4l2,1q2(1d2S2F0i2J3b0h1(251l4}1o4{4_2,520#2)4L1}0Q0`313t4-3^0P2_5j4=320h0`0B0R0h1C0E0z5o5e1S0_040L3A0s5G0s5k5f0`0#0k5z4R0=5m3g5O4X0=0k0D0`0e0e2X2o5Z5T3b5C0G5(3D0g5C0b0E0q5N4m5J5B0`0F3t5I5p3o0`2Z0D5,3%5C5{4m5}5A5 040E0b0O0e2v0w5x0O0d0R2v633^5C0Y5E4t5H6t685P015.0`5:5=6n1}0d0`0y6C32600d62675^0=6E040J5|6N3c6J6L4$6u5H6T6y046A5?2,5~016P6G5@6*0t0`6c6e6g6i6k6m6M6*6P6R6{696U6b6d6f0E6h0z6j6l0E5F6Y6v5U015g040R6(2}7d3w6;736@776_7a6.705C6r6X7c6t6!5/5;7j386T6,6H6a1G6d0E0e1 5v0R5x0b6S6|0`6~2*7l3D5C0X0M3A067z6*7g5M7H015R5I7t6w0t0k5h2v7L7N5w5y7:7e5*7,6#6%7,657S706:0461830`6q7b6Y6T872Z0j0l0E0v0j7M5u7{856w6}8q7e875t7O5x8a045+7}7m886K8z667W6T0Q5r040B3e5:8z0Y8d6u7A6z7C7,7G8C4B0`7J0O7_8o7P0z7R8Z640`0U7,8g8F8-6o0`0T8t3b8s6 7;6J8i8k8m7`8*7$7y8J0`2v0O0j0z1c8~8u908j8l8n8x7|4$7%6Z7)5L0E7D2B6T7.8;7?040h7^7476786`6)7u0`8B9G6w818W8@1}849f8D899O5_048c6s7c8f9h929k8p9R3D8}8I6/5s8)8y9U0=7 9;719T9K7~5`8{3D8K0`0o0z0j7s9`5)8b8S7(709M6B9@8Ya58!048$8(9l8,af8.048:9@8=6W2}6T5C8`9)3%9+7k9!8E919j949:9n979q049a9c9e9,869#aE9/9m3~9o5G98047+9@9waq9y0v0k7`a4at6*9?am3^ab9t5d6w9QaO8 9z0W0(2O8X7U7,0b1`0401018Q7w3~aI860g0`2%2X0O8z9Ja,aPa{a}a+7Ea-9|axa:7Baca/6D6F8;6V8Qa89p707g7i9}3%a;a 046-bv6I726?756^798zb8467ya96w7g0k3FbG410`aFaT387Xay5R2Xb$1}bIadbxaq8#0R7K9%8*albj8rb@bM6a0l3ea3b~bo9H8A9X7xbW8T9-04b)bJbLb 9g04a(a*bhbybl2Xbn9u7T040Nb1b3010C0Cb69@6p3K0n5b0E2C2%cJ4|1w4~2F2H2D1%1)2F0v1NcM0n4}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

.128013s3o_8bcdufvg/T0ly n7apS.r1F-me,(P2=4:}+twki9][5h{)6050i0E0O0v0R0q0b0s0h0q0v0b0b0J010O0R0w010406050b0j0D0D0v0z0r040x0d0q0j0@0d0t050n0~1012140|0w041d1k051n0n1n1p1k0|0i0R0l0,0.0:0=0W0R0m0W0q1D0W0O0`050%0g0q0E1y0/0;011C1E1G1E0O1M1O1K0O0g0d0i141L0z1l0O0W0,170b0w0v0t0=0I011Q1A010k0)0E0t0v0D0E1K1=1@1|1S1 1O22240`0a0s0H0z0d0w0d0b0R1a0t0s0#1:0z0z0E0h2p1d270t1l0n1.2C0O1,1+1-0i290=1G0t212m1K1v1x0-1R2M0R2O0t1(1w1K0w2v1l2A2C2*0}1?2q2U1}2Z0z110q0`0s0A2z2.0{2-282:1S2=2@2_0I2|1@2~2A2L01330v2^040s0c372B0|3a310=3d3f0s0K3j392.3b3p2_0V3t3l3v3n3c0d2?3e2_0Z3A2 2/1z323F343g0u3K3m3N3o3P3H3g0f3T3C3V3E3G3q0S3#303%3x040A0p3,3M2V3(3Q0A2{1e2}3B3-3^3/0A363}383 3@2;3X3f0A3i453k3L3w4a0`0A3s4e3u40493)4j3z4m474h4q3:3J4t4g3D423S4z3U414i3:3!4E3$4G4w0A3+4K4o3O4w0I3=4Q484S3Q0I3|2*4u4B4H0I444$4A3.4)4d4,4F4p4Z4l4;4L4?3Y0I4s4_4R3W4T4y4 4X514Z4D544v4Z4J594(4T4P5d4.4w0c4V5h4M3Q0c4#3~4-5n3Y0c4+5r4=4Y5u4:5x4`5z3f0c4^5C503_5u4~2}1m2(1d2S2F0i2J3b0h1(251l5R1o5P2,4m055W0#2)5D0=0Q0`313t5s1}0P2_5=5y3o0h0`0B0R0h1C0E0z5`5-010_040L3A0s6c0s5?1S5/040#0k655J5^3g6l551~0D0`0e0e2X2o6u6p3b680G6z3D0g680b0E0q6k5(5{670`0F3t6e6M0t0`2Z0D6D3%686P4m6R666T040E0b0O0e2v0w630O0d0R2v6X3^680Y6a4t6d6~6$5J6F0`6H6J6^1}0d0`0y76326U0d6W6#6f0=78040J6Q7h3c7d7f4$6 6d7n7204746K2,6M7j7a6L6%0`6*6,6.6:6=6@7g7A0`7l7M7E6)6+6-0E6/0z6;6?0E6b7s706q6h0R7y2}7%3w7F7T7I7X7K7!7D5J686|7r7$6~7u6G6I7+387n7B7b3o0`1G6+0E0e1 610R630b7m7N7k8i66680X0M3A067~6M6h6j86016n6e7^6q0t0k5:2v8b8d62648A6A0`6C8K6E80758O6Y6O8l5J6(6V8w6`7{3~7}7n8X0d0j0l0E0v0j8c608I8V6q7j7P2*7-4B5~8;8f8J7z8m8M8w8)7q5N6M6Z8?3b0Q5}040B3e6H8Z0`0Y7#7s7 73818w858S41880R8a8:8e8g9i040U947p9A0T9a3D8^9H3.7d8+8-8/8H8 8q8%8t0`2v0O0j0z1c7Q8W9M8,8.9x8=4t068r7t9U6i0E822B7n8y948D040h8F7U7W7Y7L917_939s1}7v7x9A6!8`8(9Ea61S8!9l6 ad042Z9N9)9Q639K3^9J9#8B8}9y909792048Na3aval7eaaar1}9c0`0o0z0j7@aD8L049k6}7$9n7w9paf7i799D04890O8G8~9zaZ6N9Ba$8Ya-689Gau3batac6S9%9O9*9R9,9T666h9W9Y9!a{7Ram9(9Pa+ay469.6c7n8u9=8w9_a-8C0`0v0k8HaPaza4aB8wa8aYaQ3D99a^8|9|0W0(2O9q7O8w0b1`0401019A6{ai8s6%0g0`2%2X0O9AaCbuaE61bHbt83988UbD3%by8RbA3%9rb?9taF96b,aAaT7|9m9:7*aI1Sb;9?5,5Jb^b%7.7S7H7V7J7Z9A8#467}bU5J6h0k3Fc48704apbe2B8{b@6n2Xcr01c6bJ047Cb_2;9u9wcu8ha-cab}9$040l3eaOcMcHag8MbSaUclaja|ctbdcEcGcbbEbqbsb#a$b)2Xb+9@8j0NbLbN010C0CbQa=9j9S9/b30`8va-bmcW3o9{7G0e0l0R0#c:a-cDd1aScj3kb2cn9V0$b6cB0tbWa%21didacC8Qc784a#bncJa)a a,dA6`cE0J8_c,3%0D0R0`5l3~9-cm7(d6bkd85_bn9{0~0wbY24dzdQ3^dkdLb.b8cQ0h0R1Nc@c86qahc!c$d504c3b/b`d_d{cB0dczb77,aWa9cNdFdA6(a(a*axcVd/1}7`bTaVc%cue9bKe5a7dCc*a$ekdJ0zencPd~0`9CdG9|d`1O9Ferc1e2e48`cxas6n2Zb!ex7cc(axeAeKdd7;a1d|eU776ncqeZcseuegcFa$dddfdhdl0GcZc0c#d4dq9;0qcBd;eo1ScOc^7ReCcL9AeJei5:eMd|7na?3K0n5*0E2C2%fq5Q1w5S2F2H2D1%1)2F0vd{2C5R0|0n0#0%0)0b04.
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

.128013s3o_;8bcdufvg/T0lyàq n7apS.r1FLmeh,(P2=4:}twki9][5RE{)é6050j0H0R0y0U0r0b0v0i0r0y0b0b0N010R0U0z010406050b0k0G0G0y0C0s040A0d0r0k0|0d0w0v020y0G0z0f0v0Z0H160C0u0k0H0b050o13151719110z041x1E051H0o1H1J1E110j0U0m0;0?0^0`0I0U0n0I0r1X0I0R0 050,0h0r0H1S0@0_011W1Y1!1Y0R1*1,1(0R0h0d0j191)0C1F0R0I0;1c0b0z0y0w0`0M011.1U010l0.0H0w1k0H1(292b2g1:2j1,2m0G2o040a0v0L0C0d0z0d0b0U1f1h0*270C0C0H0i2J1x2q0w1F0o252V0R2322240j2s0`1!0w2l2G1(1P1R0=1/2)0U2+0w1 1Q1(0z2O1F2T2V30122a1h2;2h2_0C160r0 0v0D2S3410332r361:383a3c0M3f2b3h2T2(013m0y3b040v0c3q2U113t3k0`3w3y0v0O3C3s343u3I3c0Y3M3E3O3G3v0d393x3c0(3T3i351T3l3Y3n3z0x3%3F3*3H3,3!3z0g3:3V3=3X3Z3J0V3{3j3}3Q040D0q423)2=3~3-0D3e1y3g3U434b450D3p4g3r4i4a373@3y0D3B4o3D3(3P4t0 0D3L4x3N4j4s3 4C3S4F4q4A4J463$4M4z3W4l3/4S3;4k4B463`4X3|4Z4P0D414%4H3+4P0M484-4r4/3-0M4f304N4U4!0M4n4|4T444 4w524Y4I4_4E574(593^0M4L5c4.3?4:4R5i4@5k4_4W5n4O4_4$321K2~1x2/2Y0j2$3u0i1 2y0)1Q1F2}0H2 3g3M055F0*5N5j010T0 3k5P581:0S3c5Z5d3l0i0 0E0U0i1W0H0C5(5U0~040P3T0v5|0v534b5W040*0l5?5o015$3z653u0l0G0 0e0e2@2I6f6a3W5^0K6k3}0h5^0b0H0r644F5 2h5^0J3M5~5!3H0 2_0G6o4b6z6B6x3l0 1v0R0e2O0z5;0R0d0U2O6I6y0 0$5`4M5}6)6C5)0`6q0 6s6u6Z1:0d0 0B6=6E046G6L6D016@040N6~6,3v6F0d6H6(6*5|6M6-6r6t6v326 716_6w6 0w6O0b6Q6S6U6W6Y4F6+5U71737w7d76046P6R0H6T0C6V6X0H5{7b7x66610U7h3g7P3P7p7r7H7t7L6`015^6%4|7O6*7C6.046:7T3r7C7k7$7o041!7q0H0e2j5/0U5;1w7B7j0 7A307V6l0 0#0Q3T066)7C61637$685~7m750w0l5X2O7}7 5:5=8n5@0 6n8x667.7:7$6K848o77797i755^6$7N7b7C7_2_0k0m0H0y0k7~5.8v747y868$667_5-805;8F8z7^8J8/046A8H5U0T5+040E3x6s8?0$8P7,6 8D7g7$7@8B7W7`0U7|8Z8-0C838L8y040X8;6|788?0W8)3u7z9s4U778U8W8Y8u818w4|8f7O8h0 2O0R0k0C0w9v449x8V8X9f8#4M9F7c6 8i0H7;2U7C8l7^8q040i8s7G7I7K7v9j666m7$966;9a8a8@9O4k8=9{3}8N7)4h7+8R9Q9z9T9C9~2h9u8_8*5,8!aba16J8:ak37a09=3u8G888h8|0p0C1u91938g957f9`aq3W99aF9P9c9e9B828?9man6N9o8K5O6 5^9raf9t8(aY9w9o9y9SaM9D4h9W9475619J9L9Na#aJ8T9R9Aai8.9VaBa/0 8jaQ0`9(b33v9*7F0m0U0*8?8AaI4b9_9#5T9?6#a44pa69Y9I0+a=ac3l0h0 2vbd9^aDbi7?6^9n7{0R8ta|9hazb67z87aU750G0U0 4=9Ea 8`b19!8k5%b68p0 babcb69@b6bh91bm3Dbo8IaS0baaaNa@4baeat7nbvaK0Rbyb,bA98bDb#bw9dbGb^bJbLc6bfao042I1q9ibO9k0K0$92a~9Gbp040l3Ybt6{6}b*0 8^b}b=a*cw70682@cF8S78b@a*ck7=aV0 b/107+bV7Q0 7ScF0d682_c1b`cgcEcd047lcfaR7F7s7J7u7Mc(6?68cvc^6{c*c.0`aHclag7E7q0eb(c@c 7%8z8O7acUa.bW626tcFb-c+c-d29bbFbH9gcO9$cQ9l9ncyd9aW3%0o5R5M1G5y0o5A1x0R5CdI2!2W1~202Y0y1+dDdG5J1Dbj3u2O0G7~0y0T7}0I0c0 1p1r1t1v0vcS1G3h1E0!1h0L0s251g0J0v0.0v0w006P0v2a0:2F0^0UdS0v2L0G2`2j5;0v0k2K5.2J2m7Le52l0j2b0R0v1t001g0v1,e5175F9L0R7l1N1I040F0y0v0b1c1e0Uex2}2E2G0%1-5.0U0ve42L9,eU0Cei2+eyc91-5F0wbG2me.eyd/eC0z1,0:5Q5G040K6Gd~a*cpdC3z0j0keceleP0wen2OeYet2L2a0CeC0C6X0;0+bGe*7|eFd?040L0d9LeyeKe#5;d~exeKeO7{0%fw0v0G0%d|2Le{5Sci0Gcn1xf3d~eR5L0v0t2Bd{0Id}fH0-0:fB9L0-et0%0n3x1q2let0zf6fD9deheje,1g7qax2Qf9eAe%5F1l0C0%0I2l2Hex6%eG2/3u1=1Z1#1%dX3W2u2l2n0 2A0A9,0}etd`d|a?325Lbj315Of3a7b?cbds698572cF5^0Xbedna$dxgPa2cAdjc4dlbEe+gGaOdw9pcz040WcpcCdgcua+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

.128013s3o_8bcdufvg/0ly n7apS.r1Fme,(P2=4:}twki9][5h{)6050i0C0L0u0O0p0b0r0h0p0u0b0b0H010L0O0v010406050b0j0B0B0u0y0q040w0d0p0j0;0d0s050n0{0}0 110_0v041a1h051k0n1k1m1h0_0i0O0l0)0+0-0/0T0O0m0T0p1A0T0L0@050!0g0p0C1v0,0.011z1B1D1B0L1J1L1H0L0g0d0i111I0y1i0L0T0)140b0v0u0s0/0G011N1x010k0$0C0s0u0B0C1H1/1;1_1P1|1L1 210@0a0r0F0y0d0v0d0b0O170s0r0Y1-0y0y0C0h2m1a240s1i0n1+2z0L1)1(1*0i260/1D0s1~2j1H1s1u0*1O2J0O2L0s1#1t1H0v2s1i2x2z2%0`1:2n2R1`2W0y0~0p0@0r0z2w2+0^2*252-1P2/2;2?0G2_1;2{2x2I01300u2=040r0c342y0_372~0/3a3c0r0I3g362+383m2?0S3q3i3s3k390d2:3b2?0W3x2|2,1w2 3C313d0t3H3j3K3l3M3E3d0f3Q3z3S3B3D3n0P3Y2}3!3u040z0o3)3J2S3#3N0z2^1b2`3y3*3=3,0z333`353|3;2.3U3c0z3f423h3I3t470@0z3p4b3r3}463$4g3w4j1j2#1a2P2C0i2G380h1#221i4u1l4s2)4q4z0Y2$3Z3=0N0@2~3q4d3A0M2?4Q3R3~0h0@0A0O0h1z0C0y4V4L1`0?040J3x0r4;0r4R3!4N040Y0k4*4l1P4T3d4}45270B0@0e0e2U2l5752384-0E5c3A0g4-0b0C0p4|4q4W4,0@0D3q4?5p2 0@2W0B5g3!4-5s4j5u4+5w040C0b0L0e2s0v4(0L0d0O2s5A3=4-0V4/4j064=5#5F4~0/5i0@5k5m5U1`0d0@0x5.5H5y5t4@3=5:040H5_5v3l5x0d5z5Z5$4=5`1`5*045,5n2)60015|5=5o5G615I5K5M0C5O0y5Q5S0C5 6k6g0@5~5E685H5J5L5N5P5R5T65665%530/4_0O6d2`6L3t0@6D6o6q6s6I6e6w4-5Y2%5!6K5#6B5)5j5l6Q356,6x046i6!5(390@1D5K0C0e1|4$0O4(0b6v6`5|6z2%6S3A4-0U0K3x066)4;6=4_4{5?0/504?6j6`0s0k0@0l0O0Y6o0h0j0y2k6:2y6=5e7n016a6c7I5W6%3{6*6=0s620B0b704#4%7C766M6?796R7R0g6|0O5K7M0@5f7r7#7K6/7I6h7I7S046}0L6 717Y757;387_833A7{2l0C7U7.040E0V0V4:6K7k0@0k3C7!6T045^865B5r8n878k7X734)6A6f0d502U8u3+7T7V808y826_7#6$8h6*7j6f6O7E516f7{8J4(7^5;7`6U6n6F6r6H6u8r5V0@7O438Q8i8W8w728Z8-5/8#8{5H7w7y2s7A7C6P8c8e7g8=8R6w7l5l8F3=7?5-8~0/858M8o7}7 8x748c0R8$8p638c0Q3H0n4I0C2z2!9B4t1t4v2C2E2A1!1$2C0u1K9E0n4u0_9R0Z0#0%04.