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

时间:2012-04-05 01:51:26

标签: c++ design-patterns architecture filesystems

我一直在寻找一个文件系统的库,它允许在纯粹的应用程序级别上安装路径。这可能不仅仅被称为“路径安装”,因为它具有os级别路径安装的内涵,但是其他东西,我不确定术语。我希望能够找到一些,但无法找到我正在寻找的东西(boost :: filesystem是我找到的最接近的)。我希望能够比较几个不同的库,希望看到它们有哪些优点和缺点。

我的意思是带有路径安装的文件系统是这样的,我会有一个路径,如

"SomeRoot:data\file.txt"

并且"SomeRoot"将替换为C:\SomeFolder",它将被设置为文件挂载系统。

有没有人知道允许路径安装的文件系统?

编辑:

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

5 个答案:

答案 0 :(得分:2)

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

MountPoint 哪个将用作“挂载点”,例如SomeRoot

MountResolve 在“解析”文件位置时,mount point指向的位置是哪个位置。这与您的C:\SomeFolder相同。

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

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

ResolvePath的内容非常简单,您需要做的就是替换MountPoint中的当前mountPath字符串,并将结果放入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设置为SomeRoot:data\file.txt,您现在可以将C:\SomeFolder\data\file.txt解析为C:\SomeFolder\。但是,你提到最后没有尾部斜杠。由于目前没有任何内容可以验证斜杠,因此结果为C:\SomeFolderdata\file.txt。这是错误的。

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

void FileSystem::SetMountResolve(const String& mountResolve)
{
    mMountResolve = mountResolve;

    if(*(mMountResolve.end() - 1) != FOLDERSLASH)
        mMountResolve += FOLDERSLASH;
}

这将允许基本的“FileSystem”类具有一个MountPoint / MountResolve。扩展它以允许多个安装点也不是很困难。

答案 1 :(得分:1)

  

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

你应该忘掉它。可以在linux上阻止安装路径/驱动器(可能需要管理员权限),并且在Windows上没有内置机制(尽管有目录连接)。在某些发行版上,你必须是root用户才能安装cdrom驱动器。手动

  

有没有人知道允许路径安装的文件系统?

ntfs,ext3,jfs。操作可能需要root / administrator特权。

  

并且“SomeRoot”将替换为C:\ SomeFolder“

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

- 编辑 -

  

我的意思是带有路径安装的文件系统是这样的,我会有一个路径,如    “SomeRoot:数据\ file.txt的”

为fopen或您使用的任何内容提供自定义包装器。或者制作实现“文件”的自定义类。在该类/包装器中,通过在提供的文件路径上执行搜索/替换来添加对“安装”的支持 - 可能使用存储在程序中的变量集合。这是最简单的解决方案。当然,您还必须包装您将使用的其他文件功能,但这仍然比跨平台安装更容易。

答案 2 :(得分:1)

您可能还想考虑PhysicsFS。实质上,它是一个抽象文件位置的库。您可以定义“搜索路径”,每当您读取文件时,都会在这些位置搜索,即文件夹或存档。例如,如果您想阅读“logo.png”,可能会在以下位置进行搜索:

C:\mygame\data
E:\mygame\data (read-only CD-ROM)
C:\mygame\data.zip

编写文件时,它始终存储在特殊的“写入路径”中。

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

  

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

好像您正在寻找符号链接功能。

在Posix系统上,例如Linux / Unix你可以看看link()/ symlink()。这个功能一直存在,而且相当稳固。

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

文件系统的实际安装是一项棘手的工作,实际上取决于您正在安装的内容 - NTFS,FAT,ext3,XFS,NFS,CIFS,WebDAV等等。