| 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 |
|
|