Nada

Laboration 7 - Katalogträd

Kataloger och filer bildar ju ett träd och det ska ditt program visa upp. Grafiken ska ha följande utseende.



Man bör alltså kunna använda en något modifierad molekylgrafik och den finns förberedd i /info/grudat03/filgrafik.py). Liksom i molekylfallet gäller det för dej att först bygga upp hela trädstrukturen från en formel, men formeln tar nu många rader. Katalogträdet ovan beskrivs på följande sätt
(
labbar
(
lab1
)
(
lab2
(
lab2a
)
(
lab2b
filx
)
(
lab2c
)
fil2
)
(
lab3
)
fily
filz
)
På bilden syns bara kataloger, inte filer, men i labbar finns filerna fily och filz och i lab2b finns filx. Syntaxen för textbeskrivningen ska du själv fundera ut och fylla i här:
<dir>    ::= 
<subdirs>::= 
<files>  ::= 

Katalogutskrift

Första versionen av ditt katalogprogram ska fungera så att
     python katalog.py ~henrik/labbar
ger utskriften ovan. Låt programmet börja så här.
# coding:iso-8859-1
from sys import argv
from os import listdir
from os.path import *
Om du startar programmet enligt ovan kommer argv att bestå av python-kommandots argument, alltså argv[0]=katalog.py och argv[1]=~henrik/labbar. Anropet listdir(argv[1]) returnerar en vektor av filer och underkataloger i den angivna katalogen och dom ska du ju skriva ut. För att få alla underkataloger först och vanliga filer sist är det bäst att gå igenom vektorn två gånger och använda något av följande villkor
   if isdir(name): - - -
   if isfile(name): - - -
Ett problem är att listdir ger korta namn på underkatalogerna, till exempel lab1, medan isdir vill ha det långa namnet, alltså ~henrik/labbar/lab1. Tydligen måste du klistra ihop överkatalogens namn med ett snedstreck och ett kortnamn för att isdir ska bli nöjd. Men i dina utskrifter vill du bara ha korta namn och det kommer fram med anropet basename(longname).

Med rekursiva anrop till underkatalogerna kan hela utskriften göras av ett enda anrop till funktionen lista.

def lista(path):
    print "("
    print basename(path)
    ls=listdir(path)
    - - -
Om programmet anropas utan ett katalognamn som argument bör det använda katalognamnet ".", alltså den katalog man kör i.

Katalogträd

Kopiera nu ditt program till dir.py och fortsätt att arbeta med den filen. Nu ska den också importera din kömodul och filgrafikmodulen. I stället för att bara skriva ut kataloger och filer ska du nu även lägga in dom i en kö. Köns första post blir alltså vänsterparentesen, den andra blir katlognamnet etc. Då kan du nämligen efteråt bygga upp en trädstruktur från kön med rekursiv medåkning, precis som i molekylfallet (fast klart enklare). Noderna har nu textfälten name och files, där files är en lång textsträng av filnamn med emellan.

När kön har byggts färdigt ska anropet dir=readdir() tillverka hela katalogträdet och sätta dir till roten. Och sedan ska anropet show(dir) rita upp hela trädet.

Extrauppgift för högre betyg (välj den)

Knapparna i grafiken reagerar när musen förs in över knappen ( och när musen lämnar knappen (. När man trycker ner vänster musknapp händer inget särskilt, men det ska du ändra på. Ordna till exempel att alla filnamnen skrivs med stor stil då.

Med denna labb tackar Grudat för ditt intresse och dina goda insatser. Om du inte redan gjort webbkursvärderingen är tillfället nog inne nu!

  

Löst av ............................................hoppas.....................den.......................


Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 5 december 2003
Tekniskt stöd: <webmaster@nada.kth.se>