など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.txt
にSomeRoot: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を持たせることができます。これを拡張して複数のマウントポイントを許可することはそれほど難しくありません。
これはファイルシステムの仕事であり、アプリケーションレベルのファイルアクセスライブラリではありません。すべてのUnix中心のファイルシステムはこれをサポートしています(それはUnixにとって基本的に必要な機能です)。Windows 2000以上ではNTFSもそうです。 – Josh
@Josh:私のアプリケーションはクロスプラットフォームなのでアプリケーションレベルにしたいと思っていました。私のリソースライブラリの。 – mmurphy
@mmurphy Qt Resource Systemのようなものが欲しいですか? – Synxis