允许在应用程序级别上装载的文件系统库

File system libraries that allow mounting on an application level

本文关键字:文件 文件系统 系统库 应用程序      更新时间:2023-10-16

我一直在研究一个文件系统的库,该文件系统将允许在纯粹的应用程序级别上进行路径挂载。这可能不仅仅被称为"路径挂载",因为这有操作系统级路径挂载的含义,但我不确定术语。我本来希望能找到一些,但找不到我想要的东西(boost::filesystem是我找到的最接近的文件系统)。我希望能够比较几个不同的图书馆,看看它们有什么优点和缺点。

我所说的带有路径挂载的文件系统的意思是,我会有一个像这样的路径

"SomeRoot:datafile.txt"

并且"SomeRoot"将被设置为文件装载系统的C:SomeFolder"所取代。

有人知道允许路径挂载的文件系统吗?

编辑:

由于看起来可能没有太多的库,我也对如何正确构建一个感兴趣。

如果您正在寻找"应用程序级文件系统",那么在最基本的级别上,您需要进行字符串替换。在最基本的层面上有两个字符串

MountPoint它将被用作"装载点",例如您的SomeRoot

MountResolvemount point在"解析"文件位置时指向的位置。这与您的C:SomeFolder相同。

除了那些变量的明显访问器和getter之外,还需要一个函数来解析路径,在这种情况下可以是

bool ResolvePath(const String& mountPath, String& resolvedPath);

ResolvePath的内容非常简单,您所需要做的就是在mountPath中替换当前的MountPoint字符串,并将结果放入resolvedPath中。

resolvedPath = mountPath;
resolvedPath.replace(0, mMountPoint.size() + 1, mMountResolve.c_str(), mMountResolve.size());

然而,在这一职能方面还有更多的工作可以做。我让它返回bool的原因是函数应该失败mountPath没有MountPoint。要进行检查,只需执行简单的string::find即可。

if(mountPath.find(mMountPoint) == String::npos)
    return false;

这样,如果MountResolve设置为C:SomeFolder,则现在可以将SomeRoot:datafile.txt解析为C:SomeFolderdatafile.txt。但是,您提到的末尾没有斜杠。由于当前没有任何操作可以验证该斜杠,因此您的结果将是C:SomeFolderdatafile.txt。这是错误的。

在访问以设置装载解析时,您需要检查是否有尾随文件夹斜杠。如果没有,则添加它。

void FileSystem::SetMountResolve(const String& mountResolve)
{
    mMountResolve = mountResolve;
    if(*(mMountResolve.end() - 1) != FOLDERSLASH)
        mMountResolve += FOLDERSLASH;
}

这将允许一个基本的"FileSystem"类具有一个MountPoint/MountResolve。将其扩展为允许多个安装点也不会很困难。

我一直在寻找一个允许路径安装的文件系统的库

你应该忘记这一点。在linux上安装路径/驱动器可能会被阻止(可能需要管理员特权),而在windows上没有内置的机制(不过有目录连接)。在某些发行版上,您必须是root用户才能安装甚至是cdrom驱动器。手动。

有人知道允许路径挂载的文件系统吗?

ntfs,ext3,jfs。操作可能需要root/管理员特权。

"SomeRoot"将替换为C:\SomeFolder"

您需要在程序中使用类似于环境变量的内容。使用"${SomeDir}/path"并将${萨默迪尔}替换为您想要的任何内容。这将比安装更容易实现。

--编辑--

我所说的带有路径挂载的文件系统的意思是,我会有这样一个路径"SomeRoot:data\file.txt"

为fopen或您使用的任何东西提供自定义包装。或者创建实现"File"的自定义类。在该类/包装器中,通过对提供的文件路径进行搜索/替换来添加对"挂载"的支持——可能使用存储在程序中的变量集合。这是最简单的解决方案。当然,您还必须包装将要使用的其他文件函数,但这仍然比跨平台安装容易得多。

您可能还需要考虑PhysicsFS。从本质上讲,它是一个对文件位置进行抽象的库。您可以定义一个"搜索路径",无论何时读取文件,都会在这些位置(即文件夹或档案)进行搜索。例如,如果你想阅读"logo.png",它可能会在以下位置搜索:

C:mygamedata
E:mygamedata (read-only CD-ROM)
C:mygamedata.zip

在写入文件时,它总是存储在一个特殊的"写入路径"中。

PhysicsFS还有一个应用程序级挂载的概念。引用他们的网页:

PhysicsFS 2.0将"挂载"归档的概念添加到任意搜索路径中的点。如果zip文件包含"maps/level.map"和你在"mods/mymod"上安装该档案,然后你必须打开"mods/mymod/maps/level.map"访问该文件,即使zip文件中实际上没有指定"mods/mymod"。与Unix安装文件系统的心态,"mods/mymod"实际上并没有安装zipfile时必须存在。这是一个"虚拟"目录。

当然,整个解决方案是100%的用户空间,不需要内核支持,也不需要管理权限。

Unix上的FUSE,MacOS X上的FUSE4X,我们在Windows上的带有FUSE适配器的回调文件系统。没有单一的跨平台解决方案,因为这些平台上的文件系统驱动程序体系结构不同。

似乎您正在寻找符号链接功能。

在Posix系统上,例如Linux/Unix,您可以查看link()/symlink()。这个功能已经存在了很长一段时间,而且非常稳定。

在Windows上,您可能需要查看CreateSymbolicLink()和公司。这些是在Windows 2000中引入的,我不确定它们有多强大。

文件系统的实际装载是一项棘手的业务,它实际上取决于您要装载的内容——NTFS、FAT、ext3、XFS、NFS、CIFS、WebDAV等。