我一直在寻找一个文件系统的库,它允许在纯粹的应用程序级别上安装路径。这可能不仅仅被称为“路径安装”,因为它具有os级别路径安装的内涵,但是其他东西,我不确定术语。我希望能够找到一些,但无法找到我正在寻找的东西(boost :: filesystem是我找到的最接近的)。我希望能够比较几个不同的库,希望看到它们有哪些优点和缺点。
我的意思是带有路径安装的文件系统是这样的,我会有一个路径,如
"SomeRoot:data\file.txt"
并且"SomeRoot"
将替换为C:\SomeFolder"
,它将被设置为文件挂载系统。
有没有人知道允许路径安装的文件系统?
编辑:
由于看起来可能没有很多库,我也对如何正确构建一个库感兴趣。
答案 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等等。