数据结构之文件系统模拟(树数据结构)

简介: 本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。


1 文件系统模拟(树数据结构)

在当今数字化时代,计算机技术已经深刻地嵌入我们的日常生活和工作中。而文件系统作为操作系统的核心组成部分,扮演着管理和组织计算机上数据的不可或缺的角色。它是我们数字生活的基石,为用户提供了有序存储、检索和管理数据的手段。

    文件系统的设计与演进反映了计算机科学与技术的不断发展。从早期的简单文件系统到现代复杂的分层结构,文件系统的演进一直致力于提高数据存储和访问的效率,同时满足用户对数据组织的多样化需求。

    文件系统模拟的核心思想是通过构建虚拟的文件系统环境,模拟用户进行各种文件操作,如创建、删除、移动、搜索等。这种模拟不仅提供了实际文件系统的功能,还允许用户在控制环境中进行实验,观察文件系统在不同条件下的行为和性能。

    在这个数字时代,文件系统模拟的重要性不仅在于教学和研究,也在于实际应用中。通过模拟,我们能够更好地预测文件系统在特定负载下的表现,优化存储和检索过程,提高系统的整体性能。

    综上所述,文件系统不仅仅是计算机领域中的一个组成部分,更是数字化时代的基石。文件系统模拟作为一种研究和实践手段,为我们提供了深入理解和优化文件系统的途径,推动了文件系统技术的不断发展。在未来,随着数据规模和复杂性的不断增加,文件系统模拟将继续发挥关键作用,助力构建更加高效可靠的数字化基础设施。

2 数据结构及理论建模

1. 树状数据结构

主数据结构是一个节点,节点之间的关系定义了目录和文件的层次结构。

2.节点结构:该结构表示文件系统树中的一个节点。

3.文件系统类:该类包含用于操作文件系统的方法,例如创建文件和目录、删除节点、移动节点、列出文件、搜索文件和设置权限(尽管后者当前是占位符)。

4.操作:

    createFile:创建一个新的文件节点,并将其添加到指定的父节点。

    createDirectory:创建新的目录节点并将其添加到指定的父节点。

    deleteNode:删除指定的节点并将其从父节点的子节点列表中删除。

    moveNode:通过更新父指针和同级指针将节点移动到新的父节点。

    listFiles:列出目录中文件的名称。

    searchFile:在目录中搜索具有给定名称的文件。

    setPermissions:用于在节点上设置权限的占位符。

5.等级制度:节点之间相互连接,形成层次结构。指针指向第一个子节点,指针链接同一级别的节点(同一父节点的子节点)。childsibling

6.内存管理:节点是使用动态分配的,并且在提供的代码中不会显式释放内存。

7.根节点:文件系统以表示顶级目录的根节点 () 启动。root

理论建模:

在下面的模型中,我们在根目录设立了两个文件file1, file2和两个文件夹directory1, directory2,其中我们模拟的文件是对file1进行删除操作,将file2移到directory1文件夹中,我们下面的代码也是实现了这个功能。

3 核心代码分析

节点结构:



此结构表示文件系统中的一个节点。它包括名称、文件或目录、大小、创建时间、修改时间以及指向其父节点、子节点和同级节点的指针等信息。

FileSystem 类:



创建文件:

   创建具有指定名称、大小和父节点的文件。

   将新文件节点追加到父节点的子列表中。

createDirectory:

  创建具有指定名称和父节点的目录。

  将新目录节点追加到父目录的子列表中。

delete节点:

  删除指定的节点。

  将节点从其 par 中删除

  释放节点占用的内存。

移动:

将节点移动到新的父节点。

   从其当前父节点的子节点列表中删除该节点。

   将节点追加到新父节点的子列表中。

listFiles:

   列出指定目录中的文件和目录的名称。

搜索文件:

   在指定目录中搜索具有给定名称的文件。

4 测试样例

在测试样例中,我们成功输出了此刻根目录下的文件和目录,我们将文件1移动到目录1之后查看此刻的文件显示的根目录中没有文件意1,说明我们移动成功,我们将文件2删除之后也是查看此刻的根目录下的文件和目录此刻根目录下只有文件夹1和文件夹2,说明我们的模拟实验成功。

5 算法优缺点

优势:

灵活性:

    树结构允许灵活组织文件和目录,算法同时处理文件和目录节点。

顺序搜索:

   列出文件时使用的顺序搜索适用于小规模文件系统,并确保子节点的遍历。

模块化设计:

    该代码采用模块化设计,每个操作有方法,从而促进了代码的组织和可读性。

显式内存管理:

  该代码显式处理内存管理,在删除节点时解除分配内存。

弊端:

节点移除效率低下:

    从其父节点的子列表中删除节点的算法具有 O(n) 的时间复杂度,因为它按顺序搜索要删除的节点。对于大型文件系统来说,这可能效率低下。

有限的错误处理:

    该代码缺乏广泛的错误处理。例如,它假定提供的指针有效,并且内存分配始终成功。

无权限处理:

    该方法是一个占位符,没有实际实现。对于实际的文件系统,处理权限至关重要,这需要合并。

6 附件之源代码

#include <iostream>

#include <string>

struct Node {
   

    std::string name;

    bool isFile;

    int size;

    std::string createTime;

    std::string modifyTime;

    Node* parent;

    Node* child;

    Node* sibling;

};

class FileSystem {
   

public:

    Node* createFile(std::string name, int size, Node* parent) {
   

        Node* file = new Node{
   name, true, size, "2023-12-25", "2023-12-25", parent, nullptr, nullptr};

        if (parent->child == nullptr) {
   

            parent->child = file;

        } else {
   

            Node* temp = parent->child;

            while (temp->sibling != nullptr) {
   

                temp = temp->sibling;

            }

            temp->sibling = file;

        }

        return file;

    }

    Node* createDirectory(std::string name, Node* parent) {
   

        Node* directory = new Node{
   name, false, 0, "2023-12-25", "2023-12-25", parent, nullptr, nullptr};

        if (parent->child == nullptr) {
   

            parent->child = directory;

        } else {
   

            Node* temp = parent->child;

            while (temp->sibling != nullptr) {
   

                temp = temp->sibling;

            }

            temp->sibling = directory;

        }

        return directory;

    }

    void deleteNode(Node* node) {
   

        if (node == nullptr) {
   

            return;

        }

        // 从父节点的子节点链表中移除该节点

        if (node->parent != nullptr) {
   

            Node* prev = nullptr;

            Node* current = node->parent->child;

            while (current != nullptr && current != node) {
   

                prev = current;

                current = current->sibling;

            }

            if (current == node) {
   

                if (prev != nullptr) {
   

                    prev->sibling = current->sibling;

                } else {
   

                    node->parent->child = current->sibling;

                }

            }

        }

        // 释放节点所占用的内存空间

        delete node;

    }

    void moveNode(Node* node, Node* newParent) {
   

        if (node == nullptr || newParent == nullptr) {
   

            return;

        }

        // 从原父节点的子节点链表中移除该节点

        if (node->parent != nullptr) {
   

            Node* prev = nullptr;

            Node* current = node->parent->child;

            while (current != nullptr && current != node) {
   

                prev = current;

                current = current->sibling;

            }

            if (current == node) {
   

                if (prev != nullptr) {
   

                    prev->sibling = current->sibling;

                } else {
   

                    node->parent->child = current->sibling;

                }

            }

        }

        // 将节点添加到新父节点的子节点链表

        node->parent = newParent;

        node->sibling = nullptr;

        if (newParent->child == nullptr) {
   

            newParent->child = node;

        } else {
   

            Node* temp = newParent->child;

            while (temp->sibling != nullptr) {
   

                temp = temp->sibling;

            }

            temp->sibling = node;

        }

    }

    void listFiles(Node* directory) {
   

        Node* temp = directory->child;

        while (temp != nullptr) {
   

            std::cout << temp->name << std::endl;

            temp = temp->sibling;

        }

    }

    Node* searchFile(Node* directory, std::string fileName) {
   

        if (directory == nullptr) {
   

            return nullptr;

        }

        Node* temp = directory->child;

        while (temp != nullptr) {
   

            if (!temp->isFile) {
   

                temp = temp->sibling;

                continue;

            }

            if (temp->name == fileName) {
   

                return temp;

            }

            temp = temp->sibling;

        }

        return nullptr;

    }

    void setPermissions(Node* node, int permissions) {
   

        // 设置权限的逻辑

    }

};

int main() {
   

    // 创建根节点

    Node* root = new Node{
   "root", false, 0, "2023-12-25", "2023-12-25", nullptr, nullptr, nullptr};



    // 创建文件系统对象

    FileSystem fs;

    // 创建文件和目录

    Node* file1 = fs.createFile("file1", 100, root);

    Node* file2 = fs.createFile("file2", 150, root);

    Node* directory1 = fs.createDirectory("directory1", root);

    Node* directory2 = fs.createDirectory("directory2", root);

    // 列出根节点下的文件和目录

    std::cout << "根目录下的文件和目录:" << std::endl;

    fs.listFiles(root);

    std::cout << "---------------------------------" << std::endl;

    // 移动文件或目录到另一个目录

    fs.moveNode(file1, directory1);

    std::cout << "将文件1移动到目录1中。" << std::endl;

    std::cout << "---------------------------------" << std::endl;

    // 列出根节点下的文件和目录,验证操作后的状态

    std::cout << "操作移动后的根目录下的文件和目录:" << std::endl;

    fs.listFiles(root);

    // 删除文件或目录

    fs.deleteNode(file2);

    std::cout << "删除文件2。" << std::endl;

    std::cout << "---------------------------------" << std::endl;

    // 列出根节点下的文件和目录,验证操作后的状态

    std::cout << "操作删除后的根目录下的文件和目录:" << std::endl;

    fs.listFiles(root);

    return 0;

}
相关文章
|
10天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
14天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
5天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
11天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
6天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
|
21天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3960 5
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
10天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
533 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
9天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
17天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
998 3
|
14天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
453 18
白话文讲解大模型| Attention is all you need