一个简单的模拟文件管理程序c语言,课内资源 - 基于Android实现的文件系统模拟...

一、使用说明

1.1 项目简介

在内存中开辟一个空间作为文件存储器,在其上实现一个简单的文件系统。本项目基于Android的操作系统,来模拟实现文件管理系统,并且学习Android环境下使用Java实现申请磁盘空间、分配并管理物理空间以及多级目录结构。

1.2 项目功能在内存中开辟一个空间作为文件存储器,在其上实现一个简单的文件系统

退出这个文件系统时,需要该文件系统的内容保存到磁盘上,以便下次可以将其回复到内存中来

文件存储空间管理采取显式链接

空闲空间管理采用位图

文件目录采用多级目录结构,目录项目中包含:文件名、文件大小、创建日期、文件类型信息

该文件系统提供操作:格式化、创建文件夹、删除文件夹、显示目录、更改当前目录、创建文件、打开文件、关闭文件、写文件、读文件、删除文件、复制、粘贴、查看属性、退出系统

1.3 操作手册

运行程序后,首先进入文件管理系统操作界面。

ee25543f6fd31df12fd5dc0969566d88.png

新建文件(文件夹)并命名

点击右上角“+”按钮可以新建文件或文件夹,并可以给该文件或文件夹命名。

效果1

效果2

效果3

11a90723171ac87db4139a0bbf04daab.png

c31b907c9ba287bb491ba5f9e367201e.png

cb7092038eed5b4db9876ca078f99996.png

读文件/写文件

读文件操作,点击创建的文本文件(点击图标),会显示该文本文件内容。

默认情况下文本文件为空,可以在编辑框输入文字。

编辑框下方提供三种操作,“关闭”直接关闭文件,“保存”将当前编辑框内容追加到文本后方,“重新保存”将当前编辑框内容覆盖原文本文件。

效果1

效果2

效果3

c9f18d780a88a372318cb90b511e99ff.png

923c6aeafcd9f0dabecac0c83ecae3b4.png

ef07a905a2ee01a4c40ffc5db17d0ed5.png

目录框

建立文件夹后,点击图标可以进入文件夹内,上方目录框会显示当前物理位置。

点击左上方的“后退”按钮,可以返回上一级目录。

3ebe8b70115984ad62aa14920bd0afa9.png

复制/粘贴

长按文件(文件夹),会提供四种操作,点击最上方的“复制”会复制该文件(文件夹)。

之后可以在本目录下或其他目录下长按其他文件,点击操作中的“粘贴”会将该文件(文件夹)复制到该目录下。若复制的为文件夹,文件夹目录下的文件一同复制。

效果1

效果2

efa9bc1d99a9aad6495181f4909a152d.png

73155b171a86a67b265330e30d38f399.png

属性

长按文件(文件夹),会提供四种操作,点击“属性”会显示该文件(文件夹)的属性。

72599a3f5285697453311fdcdbb45555.png

删除

长按文件(文件夹),会提供四种操作,点击“删除”会删除当前文件(文件夹)。若删除的为文件夹,文件夹目录下的所有文件一并删除。

格式化

点击最下方红色按键“格式化”,会将当前磁盘内所有内容删除。

42ecd4e82a6c71627a0d5aa0298b70b5.png

退出系统

点击右上方的“×”可以从Android平台上完全退出当前文件管理系统。

1.4 注意事项在根目录下无法点击“后退”按键进入上一层目录

0b12856c53106a9dbf804430efb72568.png

在同一目录下无法创立同一类型具有相同名称的文件(文件夹)

824aba3cedd0c345593d2b5c9a520e68.png

在同一目录下粘贴同一类型具有相同名称的文件(文件夹)时,系统会自动在后面加上“(1)”,并且后方的数字会随着同一文件复制粘贴次数的增加而增加

a5454ea2affd5f423bb8ad263162b76e.png

创建的文件(文件夹)名字不可以为空

二、概述

2.1 基本思路

该文件操作管理项目在存储空间管理上采取的是显式链接,在空闲空间管理上采用的是位图,在文件目录上采用的是多级结构。

显式链接:每一个PCB只需要记录着它在链接结构中的起始地址和终止地址。除终止地址外,每一个地址都会指向存储空间的下一个地址,在调用该文件时按这种方式就可以查找到该文件,通过这种方式提高对磁盘空间的利用率

位图:文件Client.java为位图管理,通过位图可以有效的对磁盘空闲位置进行管理,用一串二进制位反映磁盘空间中的分配使用 情况, 每个物理块对应一位, 分配物理块为1,否则为0。 申请物理块时,在位示图中查找为0的位,返回对应物理块号

多级结构:采用树型目录结构,将每一级目录作为一组存储到树形目录结构中,同一级目录下的文件和文件夹利用左右兄弟节点相互连接,为每个文件夹创立相应的孩子节点以便在该目录下创建文件(文件夹),同时生产新一级目录。

2.2 主要文件MainActivity.class & activity_main.xml (主文件,即文件管理系统操作界面)

FCB.class(目录文件控制块)

Client.class(位图管理文件)

Folder_item.xml(文件或文件夹视图)

三、具体实现

3.1 FCB

在该项目中引用了文件管理系统中FCB的概念,即文件控制块,其中包含了每个文件(文件夹)的一些状态以及一些属性:

7eb16a858d5994da285a719e0cdc8c98.png

该项目中比较重要的是FCB临时存储器arr,该存储器存储着当前目录下的文件(文件夹)的FCB。当更改当前目录时,会将arr内容赋值给树型目录结构,同时arr会清空;当添加文件(文件夹)时,arr会增加相应内容。

3.2 磁盘空间申请getAvailableInternalMemorySize(this);

通过该函数向操作系统申请一定的空间作为文件存储器,在其上实现该项目。

aff7b9cb5f307eb91381a6c78d2acf3b.png

3.3 将文件内容保存到磁盘上

读操作,利用Android系统自带的轻量级存储器SharedPreferences将存储在其中的根节点取出,并获得其子节点。

b6b60325781cc65edab938c9ced81c23.png

写操作,首先将当前页面状态进行保存,之后将根节点保存到存储器中以便下次取出。

e5675efde6da308ac59a2ca10f6fd7e5.png

3.4 多级目录结构

利用java构造树型多级目录结构。在打开app时先判断存储器中是否有根节点的值,若有直接取出作为当前根节点,若没有则建立新的根节点。

根节点的子节点为第一级目录结构下的文件(文件夹),每级目录结构下的文件(文件夹)之间通过左右兄弟节点相连接,并且每个文件(文件夹)都有其相应的父节点。对于文件夹,有一组子节点可以动态添加,而普通的文件则没有。这样的树型结构实现了快速查找文件的功能。

每次在目录文件夹下添加文件(文件夹)时,利用current_node实现。Current_node代表当前指针位置,始终指向当前文件目录的最后一个文件,添加文件(文件夹)时,会为当前节点建立左兄弟节点,并将添加的节点与其相连,同时连接到父节点。

在每次点击文件夹进入下一级目录时,current_node会置空,而点击的文件夹会作为当前目录的父节点,所有操作都建立在该父节点的子节点上。

3.5 复制/粘贴

复制操作比较简单,只需将选中的文件(文件夹)的FCB赋值给copy_node,用于记录被复制的文件(文件夹)。

粘贴操作分为是文件或文件夹,首先要查看当前目录下是否存在重名的文件(文件夹)。若存在,在粘贴时将其FCB内容的文件名进行修改,为其后面添加粘贴次数。若不存在,则直接将该FCB添加到当前目录的arr(FCB临时存储器)中。

3.6 属性查看

展示FCB内容,包括文件名、文件类型、创建日期、大小以及文件位置。

3.7 删除

点击删除后,将选中的文件(文件夹)从视图中删除,并标志该FCB采取过删除操作,并且将其从FCB临时存储器arr中删除,在更换目录时将arr内容更新到树型目录结构中。

删除操作的具体操作为函数delete,从树型目录结构中删除节点,同时判断该节点左右是否存在其他节点,若存在则将左右节点相连接,或将左节点或右节点的兄弟节点置为空。

3.8 磁盘格式化

磁盘格式化相当于第一次打开该文件管理系统的操作,将所有值重新赋值,current_node、copy_node、arr置空,parent_node为新建根节点。

3.9 更换目录

在点击文件夹进入下一级目录时,会将当前目录的FCB寄存器arr内容赋值给同级的树型目录,赋值完后清空arr,并且将父节点parent_node改为点击的文件夹,当前节点current_node置空,修改目录框内容。再进行判断,判断下一级目录中是否存在已建立的文件或文件夹,若有,则将其添加到arr中并更新视图。

在点击返回按钮进入上一级目录时,采取同样的操作,将arr内容赋值给同级的树型目录,清空arr和更新视图等,不同之处在于将parent_node改为父节点。

3.10 新建文件(文件夹)

新建操作比较简单,每次新建时会将文件(文件夹)的属性赋值给其FCB,文件名由用户输入得到,建立日期通过获得当前系统时间得到,文件类型由用户选择得到,文件大小初始值为0B。

3.11 读文件/写文件

读文件,点击文本文件时会自动弹出对话框,对话框上方字体为文本文件内容。

如果需要写内容到文本文件中,可以在输入框输入后,点击“保存”(将输入框内容追加到文本后方)或“重新保存”(将输入框内容覆盖文本)进行写文件操作。

四、总结

这次的项目主要是学习文件管理系统知识中的只是,其中涉及的知识点包括文件物理结构的存放方式、文件控制块FCB、树型目录结构以及通过位示图对空闲空间的管理。通过这次项目不仅是对操作系统中这一方面的知识点了解更深,对使用java建立多级树、管理位图有了更多的了解。

项目中出现了一些问题,偶尔会发生UI更新无法同步的问题,即在当前页面删去文件(文件夹)后,当第一次跳转回该界面时,有极小的概率文件(文件夹)还存在当前目录下,但第二次跳转回该界面时,被删的文件(文件夹)已经消失。通过调试,文件(文件夹)的确已被删除,发生的错误可能是由于UI无法及时同步更新。项目中面临最大的问题就是多级目录树的构造,由于java没有指针,构造多级树比较麻烦,于是我在父节点和子节点、兄弟节点之间建立双向连接,这样更便于查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较具体的任务,需要考虑到很多细节。下面是一个简单实现方案: 1. 定义虚拟磁盘空间的数据结构,可以使用一个大数组来模拟虚拟磁盘。同时,需要记录哪些块是空闲的,可以使用位示图来管理。 2. 定义文件目录结构,可以使用多级目录结构。每个目录项包含文件名、物理地址、长度等信息。可以使用一个数组来记录当前目录下的所有文件和子目录。 3. 实现文件的读写操作。读文件时,需要根据目录项的物理地址和长度信息来读取文件内容。写文件时,需要分配空闲块,将文件内容写入磁盘,并更新目录项的信息。 4. 实现文件的保护机制,可以在目录项记录文件的权限信息,例如读、写、执行权限等。 5. 实现虚拟磁盘空间的保存和恢复。可以将虚拟磁盘空间保存到一个文件,下次启动时再将其读入内存。 6. 实现空闲空间的管理,可以使用位示图来管理空闲块。当需要分配新块时,可以扫描位示图,找到一个空闲块并标记为已使用。 7. 实现显示链接分配方式,可以在目录项记录文件占用的所有块的物理地址。当需要读取文件时,可以根据这些地址顺序读取所有块的内容。 以上是一个简单实现方案,仅供参考。在实际实现,还需要考虑到很多细节,例如文件系统的性能、安全性和可靠性等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值