1

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

我所说的带有路径挂载的文件系统是什么意思,所以我会有一个路径,例如

"SomeRoot:data\file.txt"

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

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

编辑:

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

4

5 回答 5

2

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

MountPoint 它将用作“挂载点”,例如您的SomeRoot.

MountResolve 这是mount point“解析”文件位置时指向的位置。这和你的一样C:\SomeFolder

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

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;

有了这个,您现在可以解析SomeRoot:data\file.txtMountResolveC:\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;
}

这将允许一个基本的“文件系统”类有一个 MountPoint/MountResolve。扩展它以允许多个挂载点也不是很困难。

于 2012-04-11T03:00:04.477 回答
1

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

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

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

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

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

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

- 编辑 -

我所说的带有路径挂载的文件系统的意思是,我会有一个诸如“SomeRoot:data\file.txt”之类的路径

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

于 2012-04-05T06:24:55.287 回答
1

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

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

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

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

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

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

于 2012-04-11T11:46:21.897 回答
0

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

于 2012-04-05T05:21:38.693 回答
0

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

在 Posix 系统上,例如 Linux/Unix,您可以查看 link()/symlink()。此功能一直存在并且非常可靠。

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

文件系统的实际挂载是一件比较棘手的事情,实际上取决于你挂载的是什么——NTFS、FAT、ext3、XFS、NFS、CIFS、WebDAV 等。

于 2012-04-09T22:00:18.537 回答