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