| | import os |
| | from typing import List, Union, TypedDict, Literal |
| | from typing_extensions import TypeGuard |
| | class FileInfo(TypedDict): |
| | name: str |
| | path: str |
| | type: Literal["file"] |
| | size: int |
| |
|
| | class DirectoryInfo(TypedDict): |
| | name: str |
| | path: str |
| | type: Literal["directory"] |
| |
|
| | FileSystemItem = Union[FileInfo, DirectoryInfo] |
| |
|
| | def is_file_info(item: FileSystemItem) -> TypeGuard[FileInfo]: |
| | return item["type"] == "file" |
| |
|
| | class FileSystemOperations: |
| | @staticmethod |
| | def walk_directory(directory: str) -> List[FileSystemItem]: |
| | file_list: List[FileSystemItem] = [] |
| | for root, dirs, files in os.walk(directory): |
| | for name in files: |
| | file_path = os.path.join(root, name) |
| | relative_path = os.path.relpath(file_path, directory) |
| | file_list.append({ |
| | "name": name, |
| | "path": relative_path, |
| | "type": "file", |
| | "size": os.path.getsize(file_path) |
| | }) |
| | for name in dirs: |
| | dir_path = os.path.join(root, name) |
| | relative_path = os.path.relpath(dir_path, directory) |
| | file_list.append({ |
| | "name": name, |
| | "path": relative_path, |
| | "type": "directory" |
| | }) |
| | return file_list |