Как стать автором
Обновить

Пишем небольшой терминал на python #1. Файловая система

Время на прочтение2 мин
Количество просмотров3.1K

Всем привет, сегодня мы начнём писать небольшой терминал на Python с собственной файловой системой (виртуальной и мало чего умеющей).

#1 Файловая система - Вы здесь

#2 Приложения

#3 Обработчик команд

#4 Терминал

Структура файлов в нашем проекте

Вот как находятся файлы нашего терминала:

| pyterminal
|-- filesystem.py
|-- terminal.py
|-- com_handler.py
|-- apps
|--- notepad.py
|--- compiler.py
|--- calculator.py
|--- file_manager.py
|--- browser.py

Сейчас наш файл это filesystem.py.

Пишем файловую систему

В этом заголовке будут реализованы классы для файлов и также диска.

Импортируем нужную библиотеку:

try:
  from dataclasses import *
except:
  #ниже 3.7
  raise SystemExit('Данная версия должа быть 3.7 и выше')

Импортируем библиотеку для датаклассов и если не получилось то это python версии 3.6 и ниже. Так что выходим с сообщением о версии.

Класс для ошибки:

class FSerror(Exception):
  pass

Слишком легко чтобы объяснять.

Теперь класс для файла:

#тут сами файлы
files = {}

@dataclass
class File:
  '''
  Класс файла
  name (str): имя файла
  text (str): содержимое файла
  '''
  name: str
  text: str

  def save(self):
    files[self.name] = self.text

any - это любой тип

save - метод чтобы сохранить файл

name - параметр имени

text - параметр где текст

Класс для диска:

class Disk:
  '''
  Класс диска
  name (str): имя диска
  '''
  def __init__(self, name):
    self.name = name
    self.children = []

  def add(self, file):
    if file in files:
      self.children.append(file)
    else:
      raise FSerror(f'Файл "{file}" не найден')

  def get(self, name):
    if name in self.children:
      return files[name]
    else:
      raise FSerror(f'Файл "{name}" не найден')

  def delete(self, name):
    if name in self.children:
      del files[name]
    else:
      raise FSerror(f'Файл "{name}" не найден')

c = Disk('C:')

Получается лишь один диск. И это диск "C"

add - добавить файл в диск

get - получить файл в диске

delete - удалить файл

Теперь объявим переменную __all__ (чтобы не было не нужных использований):

__all__ = ['File', 'files', 'c']

Весь код.

try:
  from dataclasses import *
except:
  #ниже 3.7
  raise SystemExit('Данная версия должа быть 3.7 и выше')

class FSerror(Exception):
  pass

#тут сами файлы
files = {}

@dataclass
class File:
  '''
  Класс файла
  name (str): имя файла
  text (str): содержимое файла
  '''
  name: str
  text: str

  def save(self):
      files[self.name] = self.text

class Disk:
  '''
  Класс диска
  name (str): имя диска
  '''
  def __init__(self, name):
    self.name = name
    self.children = []

  def add(self, file):
    if file in files:
      self.children.append(file)
    else:
      raise FSerror(f'Файл "{file}" не найден')

  def get(self, name):
    if name in self.children:
      return files[name]
    else:
      raise FSerror(f'Файл "{name}" не найден')

  def delete(self, name):
    if name in self.children:
      del files[name]
    else:
      raise FSerror(f'Файл "{name}" не найден')

c = Disk('C:')

__all__ = ['File', 'files', 'c']

Всего 53 строчек кода. Очень мало но работает.

Итог этой части.

Мы сделали файловую систему для терминала. Вот пример использования:

#в PyShell
>>> hello = File('hello', '123')
>>> hello.save()
>>> c.add('hello')
>>> print(c.get('hello'))
123
>>> c.delete('hello')
>>> print(c.get('hello'))
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    print(c.get('hello'))
  File "C:\Users\DRA\Desktop\owner.py", line 44, in get
    raise FSerror(f'Файл "{name}" не найден')
FSerror: Файл "hello" не найден
>>> 

Готово. Продолжение следует.

Теги:
Хабы:
+4
Комментарии11

Публикации

Работа

Data Scientist
46 вакансий

Ближайшие события