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