05_Центральные_объекты_и_архитектура.md - YaroslavGit28/os.sys-PY GitHub Wiki

05. Центральные объекты и архитектура


5.1. Главные сущности

В проекте всего один файл — file_manager.py, но внутри можно выделить несколько «ролей»:

  • CURRENT_DIR: Path:

    • хранит текущую рабочую директорию;
    • синхронизируется с os.getcwd() через os.chdir() и служебные функции.
  • Функции-операции с файловой системой:

    • list_dir() — просмотр через os.listdir;
    • list_dir_scandir() — просмотр через os.scandir;
    • change_dir() — смена директории (os.chdir);
    • make_dir() / make_dirs() — создание директорий (os.mkdir / os.makedirs);
    • make_empty_file() — создание файла через os.open / os.close;
    • remove_item() — удаление (os.remove / os.rmdir);
    • rename_item() / replace_item() — переименование и замена (os.rename / os.replace);
    • show_file_info() — метаданные (os.path.*, os.stat);
    • touch_file() — обновление времени (os.utime);
    • check_access() — проверка прав (os.access).
  • Функции окружения и системы:

    • show_env_demo()os.environ, os.getenv;
    • show_system_info()os.getpid, os.cpu_count, os.getlogin.
  • Функции-обёртки над os.system:

    • clear_screen()cls / clear;
    • open_explorer()explorer / open / xdg-open;
    • open_shell_here()start powershell.
  • Интерфейс:

    • show_menu() — печать меню;
    • main() — главный цикл (обработка выбора пользователя).

5.2. Архитектурная диаграмма

flowchart TB
    subgraph UI[Пользовательский интерфейс]
        MAIN[main()]
        MENU[show_menu()]
    end

    subgraph FS[Работа с файловой системой (os / os.path)]
        CURR[CURRENT_DIR]
        LIST[list_dir / list_dir_scandir]
        MKDIR[make_dir / make_dirs]
        FILE[make_empty_file / touch_file]
        RM[remove_item / rename_item / replace_item]
        INFO[show_file_info / check_access]
        CHDIR[change_dir()]
    end

    subgraph META[Окружение и система]
        ENV[show_env_demo()]
        SYSINFO[show_system_info()]
    end

    subgraph SYS[Вызовы ОС через os.system]
        CLS[clear_screen()]
        EXPL[open_explorer()]
        SHELL[open_shell_here()]
    end

    MAIN --> MENU
    MAIN --> LIST
    MAIN --> MKDIR
    MAIN --> RM
    MAIN --> FILE
    MAIN --> INFO
    MAIN --> CHDIR
    MAIN --> ENV
    MAIN --> SYSINFO
    MAIN --> EXPL
    MAIN --> SHELL
    LIST --> CURR
    MKDIR --> CURR
    FILE --> CURR
    RM --> CURR
    INFO --> CURR
    CHDIR --> CURR

5.3. Примеры без os / без os.system

5.3.1. Очистка экрана

Без os.system (упрощённо):

print("\n" * 100)

С os.system (как в проекте):

import os

def clear_screen():
    if os.name == "nt":
        os.system("cls")
    else:
        os.system("clear")

5.3.2. Открытие Проводника

Без вызова ОС — нельзя универсально открыть Проводник чистым Python-кодом без обращения к внешним программам.

С os.system (как в проекте):

import os
import sys
from pathlib import Path

CURRENT_DIR = Path.cwd()

def open_explorer():
    if os.name == "nt":
        cmd = f'explorer "{CURRENT_DIR}"'
    elif sys.platform == "darwin":
        cmd = f'open "{CURRENT_DIR}"'
    else:
        cmd = f'xdg-open "{CURRENT_DIR}"'
    os.system(cmd)

5.4. Разбор кода по шагам: синхронизация директории

CURRENT_DIR = Path(os.getcwd())

def _sync_cwd_from_os() -> None:
    global CURRENT_DIR
    CURRENT_DIR = Path(os.getcwd())

def _sync_os_from_current_dir() -> None:
    os.chdir(CURRENT_DIR)

Что делает каждый блок:

  • Path(os.getcwd()) — берёт текущую папку процесса и хранит её в удобном объекте Path.
  • _sync_cwd_from_os() — подтягивает состояние из ОС в переменную проекта.
  • _sync_os_from_current_dir() — наоборот, применяет состояние проекта к процессу через os.chdir.

Зачем нужна двусторонняя синхронизация:

  • чтобы не расходились CURRENT_DIR и os.getcwd();
  • чтобы os.system и файловые операции работали в одном ожидаемом контексте;
  • чтобы упрощать отладку (в шапке видно оба значения).