2012-04-05 8 views
1

純粋にアプリケーションレベルでのパスマウントを可能にするファイルシステムのライブラリを探しています。これはosレベルパスのマウントの意味を持っているので、単に "パスマウント"とは呼ばれないかもしれませんが、他の何か、私は専門用語がわかりません。私はいくつかを見つけることができるようにしたいと思っていましたが、私が探していたものを見つけることができませんでした(boost :: filesystemは私が見つけたものの最も近いものでした)。私は彼らが持っている利点と欠点を見たいと思って、いくつかの異なる図書館を比較できるようにしたいと思っていました。アプリケーションレベルでのマウントを可能にするファイルシステムライブラリ

私はマウントパスでファイルシステムによって意味するので、私はこのようなシステムをマウントしたファイルに設定されます

"SomeRoot:data\file.txt"

"SomeRoot"C:\SomeFolder"に置き換えられるだろう、とパスを持っているでしょうです。

パスのマウントを許可するファイルシステムを知っている人はいますか?

編集:それはこのために多くのライブラリがないかもしれないことが表示されますので

、私はまた、適切に1を構築する方法に興味があると思います。

+2

これはファイルシステムの仕事であり、アプリケーションレベルのファイルアクセスライブラリではありません。すべてのUnix中心のファイルシステムはこれをサポートしています(それはUnixにとって基本的に必要な機能です)。Windows 2000以上ではNTFSもそうです。 – Josh

+0

@Josh:私のアプリケーションはクロスプラットフォームなのでアプリケーションレベルにしたいと思っていました。私のリソースライブラリの。 – mmurphy

+0

@mmurphy Qt Resource Systemのようなものが欲しいですか? – Synxis

答えて

2

などNTFS、FAT、EXT3、XFS、NFS、CIFS、WebDAVを、 -

は、ファイルシステムの実際の実装はトリッキーなビジネスで、本当にあなたがマウントされているかに依存しますレベルファイルシステム "とし、最も基本的なレベルでは、文字列置換を行う必要があります。最も基本的なレベルには、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()); 

しかし、その機能ではさらに多くのことが可能です。私がブールを返す理由は、関数が失敗するためです。mountPathにはMountPointがありません。確認するには、単にstring::findを実行してください。これにより

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

MountResolveがC:\SomeFolder\に設定されている場合、あなたは今C:\SomeFolder\data\file.txtSomeRoot:data\file.txtを解決することができます。しかし、最後にスラッシュを付けずに言いました。スラッシュを確認するために現在実行するものはないので、結果はC:\SomeFolderdata\file.txtになります。これは間違っています。

マウント解決を設定するためのアクセス権に、末尾にスラッシュがあるかどうかを確認する必要があります。存在しない場合は、追加します。

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

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

これにより、基本的な "FileSystem"クラスに1つのMountPoint/MountResolveを持たせることができます。これを拡張して複数のマウントポイントを許可することはそれほど難しくありません。

0

FUSE on Unix、FUSE4X for MacOS X、Windows上のFUSEアダプタを搭載したコールバックファイルシステム。これらのプラットフォームでは、ファイルシステムドライバのアーキテクチャが異なるため、単一のクロスプラットフォームソリューションはありません。

+0

いくつかの主要なos関連ライブラリでこれを行う方法はありませんか?私は、これを行うための "文字列と置き換え"スタイルライブラリがあると思います... – mmurphy

+0

@mmurphyまったくありません。ファイルシステムをマウントするには、カーネルモードのドライバが必要です。 –

1

私はパスがあなたがそれを忘れなければならない

を取り付けることができますファイルシステムのためのライブラリに探しています。 Linux上でパス/ドライブのマウントをブロックすることができます(管理者の特権が必要かもしれません)。また、Windowsにはそのためのメカニズムはありません(ディレクトリジャンクションがあります)。特定のディストリビューションでは、cdromドライブをマウントするにはルートにする必要があります。手動で

パスのマウントを許可するファイルシステムを知っている人はいますか?

ntfs、ext3、jfs。操作にはroot/administratorの特権が必要な場合があります。

と "SomeRootは" Cに置き換えられます:\ SomeFolder」。

あなたは、あなたのプログラムの環境変数のようなものを使用する必要が使用する "$ {SomeDir} /パス" と交換してください$ {SomeDir}あなたが好きで。それは、実装よりも実装するためにはるかに容易になります。

--EDIT--

私はパスがマウントしたファイルシステムによって意味することは、私が持っているでしょうそうです通り "SomeRoot:data \ file.txt"

fopenなどのカスタムラッパーを用意してください。または、「ファイル」を実装するカスタムクラスを作成します。そのクラス/ラッパーでは、プログラム内に格納された変数の集合を使用して、提供されたファイルパス上で検索/置換を行うことによって、 "マウント"のサポートを追加します。それが最も簡単な解決策です。もちろん、使用する他のファイル関数もラップする必要がありますが、クロスプラットフォームのマウントよりもはるかに簡単です。

0

シンボリックリンク機能を探しているようです。

Posixシステムでは、 Linux/Unixでは、link()/ symlink()を調べることができます。この機能は永遠にあり、かなり安定しています。

Windowsでは、CreateSymbolicLink()と会社を調べることができます。これらはWindows 2000で導入されたもので、どれくらい堅牢であるかわかりません。あなたは、「アプリケーションを探している場合など

1

また、PhysicsFSもお考えください。本質的には、ファイルの場所を抽象化するライブラリです。 「検索パス」を定義することができます。ファイルを読み込むたびに、その場所、つまりフォルダやアーカイブで検索されます。たとえば、「ロゴ」を読んでみたいとします。。「、それはのような場所で検索されることがあります。

ファイルを書くとき、それは常に特別に格納されて
C:\mygame\data 
E:\mygame\data (read-only CD-ROM) 
C:\mygame\data.zip 

『PNG書き込みパス』

PhysicsFSは、アプリケーション・レベルのマウントの概念を持っています。自分のWebページからの引用:

PhysicsFS 2.0は、検索パス内の任意の ポイントに「取り付け」のアーカイブの概念が追加されますZIPファイルは、「マップ/ level.map」とを 含まれている場合は、でそのアーカイブをマウント」。 mods/mymod "を開くと、を開く必要があります "mods/mymod"が.zipファイルで実際に指定されていない場合でも、ファイルにアクセスするには、"mods/mymod/maps/level.map" ファイルシステムをマウントするUnixの考え方とは異なり、 "mods/mymod"は実際にはzipfileをマウントするときには が存在する必要はありません。これは "仮想"ディレクトリです。

もちろん、ソリューション全体が100%のユーザスペースであり、カーネルのサポートや管理者権限を必要としません。

関連する問題