42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
|
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
|