QVFS - 基于 FAT32 的虚拟文件系统,由 VB.NET 2005 提供支持
一个使用 VB.NET 创建的虚拟文件系统,一种将多个文件夹和文件存储在两个实际物理文件中的简单方法。
引言
这是一个 .NET 库,实现了名为 QVFS 的虚拟文件系统 (VFS),该系统基于 FAT32 的概念。它使用两个文件(一个信息文件和一个数据文件)来存储多个文件夹和文件。这仅仅是一个用于存储文件的虚拟文件系统,不包含其他功能,例如压缩功能。
源代码可以在 .NET Framework 1.1 和 .NET Framework 2.0 下编译,但未在 .NET Framework 3.0 下进行测试。
该库的目标是使用两个文件来存储程序使用所需的一切。例如,您可以编写个人邮件管理系统,将所有邮件存储在 VFS 中,而不是为每封邮件创建一个文件,并创建大量文件夹来分类邮件。您的程序可能有许多日志文件,按日期分开,因此一年将至少有 365 个文件。为什么不使用 VFS 呢?只有一个文件,易于备份、恢复和管理。
背景
这个虚拟文件系统使用了 FAT32 文件系统的绝大部分概念。您可以认为这是一个虚拟的精简版 FAT32 文件系统。下面将描述一些概念,了解 FAT32 的一些知识将有助于您理解本文档。
QVFS 的概念与技术细节
QVFS 的文件结构
QVFS 使用两个文件来创建用于存储文件的“虚拟磁盘”。
一个信息文件,扩展名为“.qfi”,另一个是数据文件,扩展名为“.qfd”,这两个文件的文件名默认相同。
信息文件仅存储 FAT,数据文件存储文件的实际数据。
下图显示了信息文件和数据文件的文件结构。

主要概念
名称 | 描述 |
集群 | 存储数据的基本单元,在此 VFS 中,每个簇为 4KB。 |
FAT | 文件分配表,它指示文件是如何存储的。换句话说,哪些簇被用来存储一个文件。 这里显示了 FAT 的一个示例。一个单元格表示一个 FAT 条目,颜色相同的 FAT 条目表示一个文件存储信息。FAT 使用链表数据结构,一个 FAT 条目映射到一个簇。FAT 条目中的数字指示在哪里可以找到文件的下一个 FAT 条目(对于 FAT 读取器)和簇(对于文件读取器),而 'FFFFFFFF' 表示文件在该簇中结束,'0' 表示该条目尚未被使用,它是空的。
|
文件夹(目录) | 一个文件夹可以包含许多文件和子文件夹。在 FAT32 中,文件夹本身就是一个特殊的文件,唯一的区别在于,文件夹文件包含其下文件和子文件夹的信息数据,而普通文件则包含其自身的数据。 |
程序如何工作
在向 QVFS 添加文件时,它首先会找到标记为“00000000”的空 FAT 条目,并返回一个可用空簇的列表,然后从头开始逐块(块大小等于簇大小)读取源文件,并将每个块放入每个簇中,并在 FAT 中写入簇索引直到文件结束。
在从 QVFS 读取文件时,它会首先读取根文件夹的第一个簇索引号,即上图中的簇 0。然后找到根文件夹的数据“文件”,并在根文件夹中搜索您想要的文件。如果文件在一个子文件夹中,它将从根目录逐个搜索子文件夹,最终获取文件的起始簇索引,并沿着 FAT 读取该文件的所有数据。
如何使用代码
要使用 QVFS,您需要先创建虚拟磁盘。虚拟磁盘由上面提到的两个文件(.qfi & .qfd)表示。
'Create QVFS disk file
QVFS.QVirtualFileSystemManager.CreateQVFSFile("C:\\test.qfi", true);
将磁盘文件添加到 QVFS
'Add the file d:\abc.txt to the root folder of QVFS
QVFS.QVirtualFileSystemManager vfm = new QVirtualFileSystemManager();
vfm.OpenQVFSFile("C:\\test.qfi");
vfm.AddNewVFile("D:\\abc.txt","\\" true);
vfm.CloseQVFSFile();
从 QVFS 中删除文件
'Delete the file '\abc.txt' from QVFS
QVFS.QVirtualFileSystemManager vfm=new QVirtualFileSystemManager();
vfm.OpenQVFSFile("C:\\test.qfi");
vfm.DeleteVFile("\\abc.txt", true);
vfm.CloseQVFSFile();
将 QVFS 中的文件保存到磁盘
'Save the file "\abc.txt" to "C:\"
QVFS.QVirtualFileSystemManager vfm=new QVirtualFileSystemManager();
vfm.OpenQVFSFile("C:\\test.qfi");
vfm.SaveVFileToDisk("\\abc.txt", "C:\\abc.txt");
vfm.CloseQVFSFile();
关于 DEMO 程序
DEMO 程序使用实际代码演示了上述功能。可能存在一些错误,且未经仔细测试。它仅用于演示。另一方面,QVFS 库经过了彻底的测试,当前版本未发现大的功能性错误。
它在左侧显示文件夹结构,并在右侧显示 QVFS 中文件的详细信息。

关注点
到现在为止,已经有很多文件系统了。这里我只展示了一个基于 FAT32 的虚拟文件系统。与 NTFS 和 Linux ext. 相比,FAT32 是一个更“简单”的文件系统,对于仅用于存储文件的 VFS 来说已经足够了,除了安全性和压缩等需求。我想与您讨论最新的 VFS 技术。请提出您的想法和建议。
历史
- 2004.08.26, 版本 0.9.0,
VFileSystem
版本 1 - 2004.09.24, 版本 0.9.5,
VFileSystem
版本 2 - 2007.10.10, 版本 1.0.0, 修复 bug 并转换为 .NET Framework 2.0 库,正式发布