core/maxframe/lib/filesystem/local.py (80 lines of code) (raw):

# Copyright 1999-2025 Alibaba Group Holding Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import glob import os import shutil from typing import BinaryIO, Dict, Iterator, List, TextIO, Tuple, Union from ...utils import implements, stringify_path from .base import FileSystem, path_type class LocalFileSystem(FileSystem): _instance = None @classmethod def get_instance(cls): if cls._instance is None: cls._instance = LocalFileSystem() return cls._instance @implements(FileSystem.cat) def cat(self, path: path_type): with self.open(path, "rb") as f: return f.read() @implements(FileSystem.ls) def ls(self, path: path_type) -> List[path_type]: path = stringify_path(path) return sorted(os.path.join(path, x) for x in os.listdir(path)) @implements(FileSystem.delete) def delete(self, path: path_type, recursive: bool = False): if os.path.isfile(path): os.remove(path) elif not recursive: os.rmdir(path) else: shutil.rmtree(path) @implements(FileSystem.rename) def rename(self, path: path_type, new_path: path_type): os.rename(path, new_path) @implements(FileSystem.stat) def stat(self, path: path_type) -> Dict: os_stat = os.stat(path) stat = dict(name=path, size=os_stat.st_size, modified_time=os_stat.st_mtime) if os.path.isfile(path): stat["type"] = "file" elif os.path.isdir(path): stat["type"] = "directory" else: # pragma: no cover stat["type"] = "other" return stat @implements(FileSystem.mkdir) def mkdir(self, path: path_type, create_parents: bool = True): path = stringify_path(path) if create_parents: os.makedirs(path) else: os.mkdir(path) @implements(FileSystem.isdir) def isdir(self, path: path_type) -> bool: path = stringify_path(path) return os.path.isdir(path) @implements(FileSystem.isfile) def isfile(self, path: path_type) -> bool: path = stringify_path(path) return os.path.isfile(path) @implements(FileSystem._isfilestore) def _isfilestore(self) -> bool: return True @implements(FileSystem.exists) def exists(self, path: path_type): path = stringify_path(path) return os.path.exists(path) @implements(FileSystem.open) def open(self, path: path_type, mode: str = "rb") -> Union[BinaryIO, TextIO]: path = stringify_path(path) return open(path, mode=mode) @implements(FileSystem.walk) def walk(self, path: path_type) -> Iterator[Tuple[str, List[str], List[str]]]: path = stringify_path(path) return os.walk(path) @implements(FileSystem.glob) def glob(self, path: path_type, recursive: bool = False) -> List[path_type]: path = stringify_path(path) return glob.glob(path, recursive=recursive) @property def pathsep(self) -> str: return os.path.sep