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