C++中的虚拟(平面)文件系统

Jas*_* M. 4 c++ filesystems vfs

基本上我需要实现一个程序来充当用户空间文件系统,该系统实现非常简单的操作,例如查看磁盘上的内容,将文件复制到本机文件系统或从本机文件系统复制到我的文件系统(包含在单个文件中)称为"disk01")并从我的文件系统中删除文件.

我基本上正在寻找跳板或一些提示,我可以从哪里开始,因为我不确定如何创建我自己的"磁盘"并将其他文件放入其中,这是一个家庭作业.

只是一个寻找方向的C++学生.

编辑:

我知道这个概念已经在几个不同的地方用作"VFS"或虚拟文件系统,有点像zip文件(你只能通过一个可以处理zip文件的程序查看内容).我基本上都在尝试编写类似于zip或winrar等的自己的程序,但不是那么复杂和功能丰富.

感谢您的建议到目前为止!你们都是一个巨大的帮助!

Som*_*ude 8

创建类似FAT的磁盘结构非常简单.

在文件中的固定位置,很可能首先,您有一个结构,其中包含有关磁盘的一些信息.然后是"FAT",这是一个简单结构表,详细说明了磁盘上的文件.这基本上是一个固定大小的结构表,类似于:

struct FATEntry
{
    char      name[20];  /* Name of file */
    uint32_t  pos;       /* Position of file on disk (sector, block, something else) */
    uint32_t  size;      /* Size in bytes of file */
    uint32_t  mtime;     /* Time of last modification */
};
Run Code Online (Sandbox Code Playgroud)

在此表之后,您有一个固定大小的区域,用于磁盘上的空闲块位图.如果文件系统可以动态增长或缩小,则可能不需要位图.然后是实际的文件数据.

对于像这样的系统,所有文件必须连续布局在磁盘上.这会在您添加,删除和调整文件大小时导致碎片化.


另一种方法是使用链接列表方法,例如在旧的Amiga文件系统上使用.使用此方案,所有块都只是链接列表.

就像之前需要一个实际磁盘数据的结构,可能还有一个显示空闲/分配磁盘块的位图.磁盘数据结构中唯一需要的字段是第一个文件的"指针".

通过指针我指的是指向块的磁盘上的位置的整数.

文件本身可以类似于上面类似FAT的系统:

struct FileNode
{
    char     name[12];  /* Name of file */
    uint32_t next;      /* Next file, zero for last file */
    uint32_t prev;      /* Previous file, zero for first file */
    uint32_t data;      /* Link to first data block */
    uint32_t mtime;     /* Last modification time */
    uint32_t size;      /* Size in bytes of the file */
};
Run Code Online (Sandbox Code Playgroud)

数据块本身是链接列表:

struct DataNode
{
    uint32_t next;  /* Next data block for file, zero for last block */
    char data[BLOCK_SIZE - 4];  /* Actual data, -4 for the block link */
};
Run Code Online (Sandbox Code Playgroud)

关于链表文件系统的好处是它永远不会碎片化.缺点是您可能必须跳过磁盘以获取数据块,并且数据块无法完全使用,因为它们至少需要一个指向下一个数据块的链接.


第三种方法,在类Unix系统中很常见,是让文件数据包含一组指向数据块的链接.然后,数据块不必连续存储在磁盘上.它将包含一些与链表方法相同的缺点,因为块可以存储在整个磁盘上,并且文件的最大大小是有限的.一个专家是可以充分利用数据块.

这样的结构看起来像

struct FileNode
{
    char name[16];      /* Name of file */
    uint32_t size;      /* Size in bytes of file */
    uint32_t mtime;     /* Last modification time of file */
    uint32_t data[26];  /* Array of data-blocks */
};
Run Code Online (Sandbox Code Playgroud)

上述结构将最大文件大小限制为26个数据块.