65.9K
CodeProject 正在变化。 阅读更多。
Home

QVFS - 基于 FAT32 的虚拟文件系统,由 VB.NET 2005 提供支持

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (30投票s)

2007年11月16日

CPOL

5分钟阅读

viewsIcon

167747

downloadIcon

1693

一个使用 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,数据文件存储文件的实际数据。

下图显示了信息文件和数据文件的文件结构。

Screenshot - FileStru.jpg

主要概念

名称 描述
集群 存储数据的基本单元,在此 VFS 中,每个簇为 4KB。
FAT 文件分配表,它指示文件是如何存储的。换句话说,哪些簇被用来存储一个文件。
这里显示了 FAT 的一个示例。一个单元格表示一个 FAT 条目,颜色相同的 FAT 条目表示一个文件存储信息。FAT 使用链表数据结构,一个 FAT 条目映射到一个簇。FAT 条目中的数字指示在哪里可以找到文件的下一个 FAT 条目(对于 FAT 读取器)和簇(对于文件读取器),而 'FFFFFFFF' 表示文件在该簇中结束,'0' 表示该条目尚未被使用,它是空的。

FATSample.jpg - Click to enlarge

  • 每个 FAT 条目为 4 字节(32 位整数)
  • 每个簇为 4KB
  • 原则上,QVFS 中可以存储的总字节数为 232*4K=17TB
文件夹(目录) 一个文件夹可以包含许多文件和子文件夹。在 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 中文件的详细信息。

Screenshot - DemoPro.jpg

关注点

到现在为止,已经有很多文件系统了。这里我只展示了一个基于 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 库,正式发布
© . All rights reserved.