Frage

Ich habe ein Python -Skript eingerichtet, das ein Betriebssystem simuliert. Es verfügt über eine Eingabeaufforderung und ein virtuelles Dateisystem. Ich verwende das Regalmodul, um das Dateisystem zu simulieren, und bin mehrdimensional, um eine Hierarchie von Verzeichnissen zu unterstützen. Ich habe jedoch Probleme, einen CD -Befehl zu implementieren. Ich weiß nicht, wie ich Verzeichnisse ein- und aussteigen kann, obwohl ich eine kleine Reihe von Verzeichnissen erstellt habe, die beim ersten Start des Programms erstellt werden. Hier ist mein Code:

import shelve

fs = shelve.open('filesystem.fs')
directory = 'root'
raw_dir = None
est_dir = None

def install(fs):
    fs['System'] = {}
    fs['Users'] = {}
    username = raw_input('What do you want your username to be? ')
    fs['Users'][username] = {}

try:
    test = fs['runbefore']
    del test
except:
    fs['runbefore'] = None
    install(fs)

def ls(args):
    print 'Contents of directory', directory + ':'
    if raw_dir:
        for i in fs[raw_dir[0]][raw_dir[1]][raw_dir[2]][raw_dir[3]]:
            print i
    else:
        for i in fs:
            print i

def cd(args):
    if len(args.split()) > 1:
        if args.split()[1] == '..':
            if raw_dir[3]:
                raw_dir[3] = 0
            elif raw_dir[2]:
                raw_dir[2] = 0
            elif raw_dir[1]:
                raw_dir[1] = 0
            else:
                print "cd : cannot go above root"

COMMANDS = {'ls' : ls}

while True:
    raw = raw_input('> ')
    cmd = raw.split()[0]
    if cmd in COMMANDS:
        COMMANDS[cmd](raw)

#Use break instead of exit, so you will get to this point.
raw_input('Press the Enter key to shutdown...')

Ich bekomme keinen Fehler, ich habe nur keine Ahnung, wie ich es tun soll, und keine Ahnung, wonach ich suchen soll, außer dem "Python -Regal -Dateisystem", und das wird nichts Nützliches.

War es hilfreich?

Lösung

Ich stelle einen Code zur Verfügung, mit dem Sie unten helfen können. Erstens jedoch einige allgemeine Ratschläge, die Ihnen bei Ihrem Design helfen sollten:

  • Der Grund, warum Sie Schwierigkeiten haben, Verzeichnisse zu ändern, ist, dass Sie die aktuelle Verzeichnisvariable falsch darstellen. Ihr aktuelles Verzeichnis sollte so etwas wie eine Liste sein, von Ihrem Top -Level -Verzeichnis bis zu Ihrem aktuellen. Sobald Sie das haben, treffen Sie nur eine Wahl, wie Sie die Dateien basierend auf ihrem Verzeichnis verwenden (wenn man bedenkt, dass alle Schlüssel in Regalen Saiten sein müssen).

  • Es sieht so aus, als ob Sie vorhaben würden, das Dateisystem als eine Reihe verschachtelter Wörterbücher zu repräsentieren- eine gute Wahl. Beachten Sie jedoch, dass, wenn Sie veränderliche Objekte in ändern shelve, Sie müssen a) Schreiben auf true festlegen und b) rufen Sie fs.sync () an, um sie festzulegen.

  • Sie sollten Ihr gesamtes Dateisystem in einer Klasse und nicht in einer Reihe von Funktionen strukturieren. Es wird Ihnen helfen, Ihre gemeinsam genutzten Daten organisiert zu halten. Der folgende Code folgt nicht, aber es lohnt sich, darüber nachzudenken.

Also habe ich mich behoben cd und schrieb auch einen rudimentären Mkdir -Befehl für Sie. Das wichtige, um sie zum Laufen zu bringen, ist, wie ich oben sagte, Current_dir zu haben, die Ihren aktuellen Weg anzeigt und auch einen einfachen Weg (die current_dictionary Funktion) Um von dieser Liste in das entsprechende Dateisystemverzeichnis zu gelangen.

Hier ist der Code, um Ihnen den Einstieg zu erleichtern:

import shelve

fs = shelve.open('filesystem.fs', writeback=True)
current_dir = []

def install(fs):
    # create root and others
    username = raw_input('What do you want your username to be? ')

    fs[""] = {"System": {}, "Users": {username: {}}}

def current_dictionary():
    """Return a dictionary representing the files in the current directory"""
    d = fs[""]
    for key in current_dir:
        d = d[key]
    return d

def ls(args):
    print 'Contents of directory', "/" + "/".join(current_dir) + ':'
    for i in current_dictionary():
        print i

def cd(args):
    if len(args) != 1:
        print "Usage: cd <directory>"
        return

    if args[0] == "..":
        if len(current_dir) == 0:
            print "Cannot go above root"
        else:
            current_dir.pop()
    elif args[0] not in current_dictionary():
        print "Directory " + args[0] + " not found"
    else:
        current_dir.append(args[0])


def mkdir(args):
    if len(args) != 1:
        print "Usage: mkdir <directory>"
        return
    # create an empty directory there and sync back to shelve dictionary!
    d = current_dictionary()[args[0]] = {}
    fs.sync()

COMMANDS = {'ls' : ls, 'cd': cd, 'mkdir': mkdir}

install(fs)

while True:
    raw = raw_input('> ')
    cmd = raw.split()[0]
    if cmd in COMMANDS:
        COMMANDS[cmd](raw.split()[1:])

#Use break instead of exit, so you will get to this point.
raw_input('Press the Enter key to shutdown...')

Und hier ist eine Demonstration:

What do you want your username to be? David
> ls
Contents of directory /:
System
Users
> cd Users
> ls
Contents of directory /Users:
David
> cd David
> ls
Contents of directory /Users/David:
> cd ..
> ls
Contents of directory /Users:
David
> cd ..
> mkdir Other
> ls
Contents of directory /:
System
Users
Other
> cd Other
> ls
Contents of directory /Other:
> mkdir WithinOther
> ls
Contents of directory /Other:
WithinOther

Es ist wichtig zu beachten, dass dies soweit nur ein Spielzeug ist: Es gibt noch eine Tonne mehr zu tun. Hier sind einige Beispiele:

  • Im Moment gibt es nur so etwas wie Verzeichnisse- keine regulären Dateien.

  • mkdir Überprüft nicht, ob ein Verzeichnis bereits vorhanden ist, sondern überschreibt einen mit einem leeren Verzeichnis.

  • Du kannst nicht ls mit einem bestimmten Verzeichnis als Argument (wie ls Users), nur Ihr aktuelles Verzeichnis.

Dies sollte Ihnen jedoch ein Beispiel für ein Design zeigen, um Ihr aktuelles Verzeichnis zu verfolgen. Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top