Как реализовать виртуальную файловую систему Python с использованием retve

StackOverflow https://stackoverflow.com/questions/8813847

  •  26-10-2019
  •  | 
  •  

Вопрос

Я настроил сценарий Python, который имитирует ОС. У него есть командная строка и виртуальная файловая система. Я использую модуль Sheve для моделирования файловой системы, будучи многомерным, чтобы поддерживать иерархию каталогов. Тем не менее, у меня проблемы с внедрением команды «CD». Я не знаю, как войти и выходить из каталогов, хотя у меня есть небольшой набор каталогов, созданный при первом запуска программы. Вот мой код:

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...')

Я не получаю ошибку, я просто понятия не имею, как это сделать, и понятия не имею о том, что искать, кроме «файловой системы на сериале Python», и это ничего полезно.

Это было полезно?

Решение

Я предоставляю какой -то код, чтобы помочь вам ниже, но во -первых, некоторые общие советы, которые должны помочь вам с вашим дизайном:

  • Причина, по которой у вас возникают трудности с изменением каталогов, заключается в том, что вы неправильно представляете переменную текущего каталога. Ваш текущий каталог должен быть чем -то вроде списка, от вашего каталога высшего уровня до вашего текущего. После того, как у вас есть это, вы просто выбираете, как хранить файлы с использованием Sheve на основе их каталога (учитывая, что все ключи в полки должны быть строками).

  • Похоже, вы планировали представлять файловую систему как серию вложенных словарей- хороший выбор. Но обратите внимание, что если вы измените изменяемые объекты в shelve, вы должны а) установить ответ на True и B) позвонить fs.sync (), чтобы установить их.

  • Вы должны структурировать всю свою файловую систему в классе, а не в ряде функций. Это поможет вам организовать ваши общие данные. Приведенный ниже код не следует этим, но о нем стоит задуматься.

Итак, я исправил cd а также написала для вас элементарную команду Mkdir. Критическая вещь для того, чтобы заставить их работать, состоит в том, чтобы, как я уже говорил выше, то Current_DIR будет списком, который показывает ваш текущий путь, а также иметь простой способ ( current_dictionary Функция) Чтобы получить из этого списка в соответствующий каталог файловой системы.

С этим, вот код, чтобы начать вас:

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...')

А вот демонстрация:

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

Важно отметить, что это до сих пор только игрушка: осталось еще одну тонну. Анкет Вот несколько примеров:

  • Прямо сейчас есть только такая вещь, как каталоги- нет обычных файлов.

  • mkdir Не проверяет, существует ли каталог, он будет перезаписать один с пустым каталогом.

  • Вы не можете ls с конкретным каталогом в качестве аргумента (например ls Users), только ваш текущий каталог.

Тем не менее, это должно показать вам пример дизайна для отслеживания вашего текущего каталога. Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top