File system libraries that allow mounting on an application level

Go To StackoverFlow.com

1

I have been looking into libraries for a file system that will allow path mounting on purely an application level. This may not be called just "path mounting" since that has the connotation of os level path mounting, but something else, I am not sure of the terminology. I was hoping to be able to find a few but were unable to find anything to what I am looking for (boost::filesystem was the closest I found). I wanted to be able to compare several different libraries in hopes of seeing what advantages and disadvantages they have.

What I mean by a file system with path mounting is so I would have a path such as

"SomeRoot:data\file.txt"

and the "SomeRoot" would be replaced with C:\SomeFolder", which would be set to the file mount system.

Does anyone know of a file system that will allow path mounting?

Edit:

Since it appears that there may not be many libraries for this, I would also be interested in how to construct one properly.

2012-04-05 01:51
by mmurphy
This is the job of the filesystem, not the application-level file access library. All Unix-centric filesystems support this (it's basic required functionality for Unix), and so does NTFS since at least Windows 2000 - Josh 2012-04-05 01:55
@Josh: I wanted it to be application level as my application is cross platform and it was going to be part of my resource library - mmurphy 2012-04-05 03:15
@mmurphy You want something like the Qt Resource System - Synxis 2012-04-08 13:20


2

If you are looking for an "application level file system" then at the most basic level, you are going to need to do a string replace. On the most basic level there are two strings

MountPoint Which will be used as the "mount point", such as your SomeRoot.

MountResolve Which is the location to what mount point is pointed at for when "resolving" a file location. This is the same as your C:\SomeFolder.

Besides for the obvious accessor and getters for those variables, there is the need for a function to resolve the path, which is this case can be

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

The contents of the ResolvePath are very simple, all you need to do is replace the current MountPoint string in mountPath and place the result into resolvedPath.

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

However, there is more that can be done in that function. The reason why I have it returning a bool is because the function should fail mountPath does not have the MountPoint. To check, just do a simple string::find.

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

With this, you can now resolve SomeRoot:data\file.txt to C:\SomeFolder\data\file.txt if MountResolve is set to C:\SomeFolder\. However, you mentioned without the trailing slash at the end. Since there is nothing to be currently done to verify that slash, your result would be C:\SomeFolderdata\file.txt. This is wrong.

On your access for setting the mount resolve, you want to check to see if there is there is a trailing folder slash. If there is not, then add it.

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

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

This will allow a basic "FileSystem" class to have one MountPoint/MountResolve. It will not be very difficult to extend this to allow multiple mount points either.

2012-04-11 03:00
by josephthomas


1

I have been looking into libraries for a file system that will allow path mounting

You should forget about it. mounting a path/drive can be blocked on linux (administrator privilegies might be required), and on windows there is no built-in mechanism for that (there are directory junctions, though). On certain distros you have to be root to mount even cdrom drive. Manually.

Does anyone know of a file system that will allow path mounting?

ntfs, ext3, jfs. Operation might require root/administrator privilegies.

and the "SomeRoot" would be replaced with C:\SomeFolder"

You need to use something similar to environmental variables in your program. Use "${SomeDir}/path" and replace ${SomeDir} with whatever you want. That'll be much easier to implement than mounting.

--EDIT--

What I mean by a file system with path mounting is so I would have a path such as "SomeRoot:data\file.txt"

Provide custom wrapper for fopen or whatever you use instead. Or make custom class that implements "File". In that class/wrapper add support for "mounting" by doing search/replace on provided file path - possibly using collection of variables stored within the program. That's the easiest solution. Of course, you'll also have to wrap other file functions you'll use, but that's still much easier than doing cross-platform mounting.

2012-04-05 06:24
by SigTerm


1

You might also want to consider PhysicsFS. In essence, it is a library that abstracts the location of files. You may define a "search path" and whenever you read a file it is searched in those locations, i.e., folders or archives. For example, if you want to read "logo.png", it might be searched in locations such as:

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

When writing a file, it is always stored in a special "write path".

PhysicsFS also has a concept of application-level mounting. Citing from their webpage:

PhysicsFS 2.0 adds the concept of "mounting" archives to arbitrary points in the search path. If a zipfile contains "maps/level.map" and you mount that archive at "mods/mymod", then you would have to open "mods/mymod/maps/level.map" to access the file, even though "mods/mymod" isn't actually specified in the .zip file. Unlike the Unix mentality of mounting a filesystem, "mods/mymod" doesn't actually have to exist when mounting the zipfile. It's a "virtual" directory.

And, of course, the whole solution is 100% user-space and requires no kernel support nor administrative privileges.

2012-04-11 11:46
by user1202136


0

FUSE on Unix, FUSE4X on MacOS X, our Callback File System with FUSE adapter on Windows. There's no single cross-platform solution because the architecture of file system drivers is different on those platforms.

2012-04-05 05:21
by Eugene Mayevski 'Allied Bits
Is there no way to do this with out some major os related library? I would think there would be a "string and replace" style library to do this .. - mmurphy 2012-04-05 05:50
@mmurphy no way. You need a kernel-mode driver to mount a filesystem - Eugene Mayevski 'Allied Bits 2012-04-05 06:10


0

Seems like you are looking for symbolic links functionality.

On Posix systems, e.g. Linux/Unix you can look into link()/symlink(). This functionality has been there forever and is pretty solid.

On Windows you may want to look into CreateSymbolicLink() and company. These were introduced with Windows 2000 and I'm not sure how robust they are.

Actual mounting of filesystems is trickier business and really depends on what you are mounting - NTFS, FAT, ext3, XFS, NFS, CIFS, WebDAV, etc, etc.

2012-04-09 22:00
by dpiskyulev
Ads