Всем привет, сегодня мы начнём писать небольшой терминал на 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" не найден
>>>
Готово. Продолжение следует.