588. Design In-Memory File System

65 阅读1分钟

image.png

    • path and filePath are absolute paths which begin with '/' and do not end with '/' except that the path is just "/".
public class FileSystem {
    // 表示文件或当前目录
    class File {
        boolean isfile = false; // 是否为文件
        // 存储当前File 下的 目录/文件 们
        // <目录/文件名, 对应的file>
        HashMap<String, File> files = new HashMap<>(); 
        String content = ""; // 文件内容
    }


    File root; //根目录

    public FileSystem() {
        root = new File(); 
    }

    public List<String> ls(String path) {
        File f = root; // 从根目录开始
        List<String> files = new ArrayList<>();

        // 如果不是根目录,遍历到指定的目录或文件
        if (!path.equals("/")) {
            String[] arr = path.split("/");
            for (int i = 1; i < arr.length; i++) {
                f = f.files.get(arr[i]); // 进入下一级目录
            }
            if (f.isfile) {
                // 如果是文件,返回包含单个文件名的列表
                files.add(arr[arr.length - 1]);
                return files;
            }
        }
        // 如果是目录,返回目录下所有文件和子目录的列表
        List<String> res = new ArrayList<>(f.files.keySet());
        Collections.sort(res); // 按字典顺序排序
        return res;
    }

    // mkdir 命令的实现
    public void mkdir(String path) {
        File f = root; // 从根目录开始
        String[] arr = path.split("/");
        for (int i = 1; i < arr.length; i++) {
            // 如果路径中的目录不存在,则创建新目录
            if (!f.files.containsKey(arr[i])) {
                f.files.put(arr[i], new File());
            }
            f = f.files.get(arr[i]); // 进入下一级目录
        }
    }

    // 将内容添加到文件的实现
    public void addContentToFile(String filePath, String content) {
        File f = root; // 从根目录开始
        String[] arr = filePath.split("/");
        for (int i = 1; i < arr.length - 1; i++) {
            f = f.files.get(arr[i]);
        }
        // 如果文件不存在,则创建新文件
        if (!f.files.containsKey(arr[arr.length - 1])) {
            f.files.put(arr[arr.length - 1], new File());
        }
        f = f.files.get(arr[arr.length - 1]);
        f.isfile = true; // 标记为文件
        f.content += content; // 添加内容到文件
    }

    // 从文件中读取内容的实现
    public String readContentFromFile(String filePath) {
        File f = root; // 从根目录开始
        String[] arr = filePath.split("/");
        for (int i = 1; i < arr.length - 1; i++) {
            f = f.files.get(arr[i]);
        }
        // 返回文件内容
        return f.files.get(arr[arr.length - 1]).content;
    }
}