一般に、独自のファイルシステム(以下FSと呼びます)を作成するには、このFS用のドライバーを作成し、OSに登録する必要があります。 なぜなら ドライバーはOSのカーネルと対話するため、マネージコードでのドライバーの作成は重要であり、そのようなドライバーのパフォーマンスは低レベルになります。 この点で、ネイティブコードで記述されたFSドライバーと、このドライバーとマネージコードの間の中間層を用意する方が便利です。 このようなドライバーはDokanプロジェクトに存在し、マネージコードでこのドライバーと対話するためのDokanNetクラスのセットも存在します。 どちらのプロジェクトもGPLv3の下でライセンスされています。
それがどのように機能するかを理解してみましょう。
Dokanは、ユーザー空間のアプリケーションとやり取りできるWindowsカーネルレベルのドライバーです。 このドライバーは、32ビットシステムと64ビットシステムの両方に存在します。 ドライバーはFSの実装を保持しませんが、OSカーネルからユーザー空間へのすべての入出力(IO)操作を通過させるプロキシとしてのみ機能します。 FS機能の実装は私たちの肩にあり、ファイルを開く/閉じる、ファイルから読み取る、ファイルに書き込むなどの基本的なFS関数を作成します。これらは、システムで対応するイベントが発生したときにDokanドライバーによって呼び出されます。 DokanドライバーにFSを登録する時点で、FS操作のいくつかのパラメーター(入出力操作ハンドラーの数、FSのマウントポイント(Dokanはリムーバブルドライブまたはネットワークドライブとして、FSのルートのみへのマウントをサポートしています)、自動操作中にエラーが発生した場合のファイルシステムのアンマウント、およびその他のパラメーター)。 その後、OSのFSのルートに新しいディスクが表示され、通常のディスクと同様に、アプリケーションとOS自体が相互作用します。 このFSで実行できる操作は、このFSの開発者、つまり私たちだけです。
DokanNetは、Dokanドライバーのラッパーです。 マネージコードを使用して独自のFSを開発できます。 DokanNetはDokanOperationsインターフェースについて説明しています。これは、FSをDokanドライバーに登録するために実装する必要があります。 DokanNetの作成者は、プロジェクト自体のソースコードとともに、このラッパーを使用した2つの例を示します。
- DokanNetMirror-既存のディレクトリのFSミラー
- RegistoryFS-ディレクトリおよびファイル内のWindowsレジストリの構造を表すFS
サンプルコードは読みやすく、Dokanドライバが提供する機能に慣れることができます。
DokanOperationsインターフェースの実装は、次の機能の実装になります。
- CreateFile-ファイル/ディレクトリを作成します
- OpenDirectory-ディレクトリを開く
- CreateDirectory-ディレクトリを作成します
- クリーンアップ-ファイルを削除/空のディレクトリ
- CloseFile-ファイル記述子を閉じる
- ReadFile-指定されたオフセットで指定された長さのファイルの一部を読み取る
- WriteFile-指定されたオフセットでファイルにデータを書き込みます
- FlushFileBuffers-ファイルバッファーをフラッシュする
- GetFileInformation-サイズ、属性、作成時間/最終アクセス/ファイル/ディレクトリの変更に関する情報の取得
- FindFiles-指定されたディレクトリ内のファイル/ディレクトリのリストを取得します
- SetFileAttributes-ファイル/ディレクトリ属性の設定
- SetFileTime-ファイル/ディレクトリの作成/最終アクセス/変更の時間の設定
- DeleteFile-ファイルを削除対象としてマークします(削除はクリーンアップで実行されます)
- DeleteDirectory-削除するディレクトリをマークします(削除はクリーンアップで実行されます)
- MoveFile-ファイル/ディレクトリの移動/名前変更
- SetEndOfFile-ファイルサイズの設定(特定の長さの空のファイルを作成するときに使用)
- SetAllocationSize-作成者は、この関数が必要な理由を示しませんでした。実際には、この関数への制御の移行は通知されませんでした
- LockFile-シングルアクセスでファイルをロック
- UnlockFile-ロック解除
- GetDiskFreeSpace-FSの使用可能/共有/空き領域の数に関する情報の取得
- アンマウント-FSのアンマウント/無効化
ご覧のとおり、DokanドライバーとDokanNetラッパーが提供する機能は非常に豊富です。 このプロジェクトに基づいて、FS SSHFSが開発されました。 誰もが自分の要件を満たすFSを開発できます。 リモートHttpサーバー上のファイルをシステムにマウントできるHttpFSの開発に着手しました。 しかし、それについては次の記事で詳しく説明します...