1

純粋にアプリケーション レベルでのパスのマウントを可能にするファイル システムのライブラリを調べています。これは、OSレベルのパスマウントを意味するため、単に「パスマウント」とは呼べないかもしれませんが、用語がわかりません。私はいくつかを見つけられることを望んでいましたが、私が探しているものを見つけることができませんでした (boost::filesystem が私が見つけた最も近いものでした)。いくつかの異なるライブラリを比較して、それらの長所と短所を確認できるようにしたかったのです。

パスマウントを備えたファイルシステムとは、次のようなパスを持つことを意味します

"SomeRoot:data\file.txt"

"SomeRoot"に置き換えられC:\SomeFolder"、ファイル マウント システムに設定されます。

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

編集:

このためのライブラリはあまりないように思われるので、適切に構築する方法にも興味があります。

4

5 に答える 5

2

「アプリケーション レベルのファイル システム」を探している場合、最も基本的なレベルでは、文字列の置換を行う必要があります。最も基本的なレベルでは、2 つの文字列があります。

MountPoint などの「マウントポイント」として使用されますSomeRoot

MountResolvemount 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 が に設定されている場合SomeRoot:data\file.txtに解決できるようになりました。ただし、最後に末尾のスラッシュなしで言及しました。そのスラッシュを確認するために現在行うことは何もないため、結果は になります。これは間違っています。C:\SomeFolder\data\file.txtC:\SomeFolder\C:\SomeFolderdata\file.txt

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

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

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

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

于 2012-04-11T03:00:04.477 に答える
1

パスマウントを可能にするファイルシステムのライブラリを探していました

あなたはそれを忘れるべきです。パス/ドライブのマウントはLinuxではブロックでき(管理者権限が必要な場合があります)、Windowsではそのための組み込みメカニズムはありません(ただし、ディレクトリジャンクションがあります)。特定のディストリビューションでは、CD-ROMドライブをマウントするためにrootである必要があります。手動で。

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

ntfs、ext3、jfs。操作には、ルート/管理者の特権が必要な場合があります。

「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」は、実際には.zipファイルで指定されていません。ファイルシステムをマウントするというUnixの考え方とは異なり、zipファイルをマウントするときに「mods/mymod」が実際に存在する必要はありません。これは「仮想」ディレクトリです。

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

于 2012-04-11T11:46:21.897 に答える
0

Unix の FUSE、MacOS X の FUSE4X、Windows の FUSE アダプターを備えたコールバック ファイル システム。ファイル システム ドライバーのアーキテクチャはプラットフォームによって異なるため、単一のクロスプラットフォーム ソリューションはありません。

于 2012-04-05T05:21:38.693 に答える
0

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

Linux/Unix などの Posix システムでは、link()/symlink() を調べることができます。この機能は以前から存在しており、かなり堅実です。

Windows では、CreateSymbolicLink() と会社を調べることができます。これらは Windows 2000 で導入されたもので、どれだけ堅牢かはわかりません。

ファイルシステムの実際のマウントはよりトリッキーな作業であり、マウントするもの (NTFS、FAT、ext3、XFS、NFS、CIFS、WebDAV など) に大きく依存します。

于 2012-04-09T22:00:18.537 に答える