Dokan SSHFS 0.1.7をリリース
Dokan SSHFS 0.1.7をリリースしました。
Dokan SSHFSは、LinuxなどSSHで接続できる先のファイルシステムをドライブとしてマウントするプログラムです。
Dokan SSHFS 0.1.7では、ファイルコピー時にファイルの更新日時が保存されるようになりました。また、ディレクトリ一覧やファイルのプロパティをキャッシュするようにしました。このため安定度が向上しています。フォルダを右クリックして「SSHFS Clear Cache」を実行すれば、そのディレクトリ以下のキャッシュを削除することができます。
便利に使わせていただいてます。
環境依存かもしれませんが、ワイルドカードを使ったファイルの列挙が
一部うまくいかないようです。
たとえば
dir *.*
はうまく動作してくれますが
dir *.c
だと「ファイルが見つかりません」
メッセージが表示されます。
これができるようになりますと grep などの効率もぜんぜん違ってくると
思うのでとてもうれしいです。
コメントありがとうございます。
実は、Windowsではワイルドカードの処理はファイルシステムドライバの
仕事となっておりまして、Dokanのワイルドカード処理は完全には仕様を
満たせていません。次のバージョンアップまでには何とか直したいと思い
ます。
お返事ありがとうございます。
なるほど。
言われてみればワイルドカードの処理をファイルシステムドライバに任せるのも妥当な判断なのかもしれません。
対象のファイルシステムがファイル名の保持にどんな文字セットを使っているかもわかりませんし。
でも「ワタシ、フツーでいいんです」という人用に既定のパターンマッチ処理でも用意してくれていると面倒じゃないんですが。
「フツーでいい」という人はあまりファイルシステムドライバを作らないという判断なんでしょうね。
今日、さっそくコピー時のタイムスタンプ保持機能が役にたってくれました。
キャッシュの効果で体感速度もぐっと上がった感じです。
( ファイルを書き込んだときはそのフォルダのキャッシュをクリアして
もらえるとありがたいです。 )
ワイルドカードの件も楽しみにお待ちしています。
私は不勉強で知らなかったのですが、こんなAPIがあるようです。
ファイルシステムドライバ用?の FsRtlIsNameInExpression と
一般アプリ用?の PathMatchSpec です。
すでにご存知かもしれませんがご参考になれば。
ところで、Dokan SSHFS で追加が検討されている機能の一覧の
ようなものはありますでしょうか?
すでに予定されていたり、考えたけどやめた、というような機能
をやたらリクエストしてしまうことにならないか心配しています。
ご意見ありがとうございます。
Dokanのワイルドカード処理はユーザモードで行っているので
FsRtlIsNameInExpression は使えないです。
PathMatchSpec は知りませんでした。試してみたところ僕の手抜き実装と
同じ動作で FsRtlIsNameInExpression と動作が異なるのでやっぱり使
えなかったです。
機能についてはこれまでまとめてなかったのでここに書きたいと思います。
今後どこかにまとめたいです。
次回のバージョンアップで予定
・ファイルの新規作成時にキャッシュがクリアされないバグの修正
・キャッシュを無効にするオプションを付ける
・アーカイブ属性をつけないオプションを付ける
今後追加するかもしれない機能(優先度の高い順)
・接続のインタフェースの改良
・・パスワードを打ってエンターを押すと接続
・・保存したときにフォームがクリアされないようにする
・コマンドラインオプションの充実
・・起動時に自動でマウントできるように
・ドライブの右クリックに切断
・シンボリックリンクの対応
・”.ファイル”の表示の切り替え
・キャッシュしないファイルをパターンで登録
・アプリのアイコンをどうにかする
・読み込み書き込みのキャッシュ
お返事ありがとうございます。
うーん。PathMatchSpec の動作は FsRtlIsNameInExpression と
異なるのですね。何のためにあるのかよくわからないです。
FsRtlIsNameInExpression の方なのですが、ユーザーモードで
使用不可であれば、カーネルモードに戻ってから呼び出していただく
わけにはいきませんでしょうか。
ユーザーモードの関数では、自前で判定を実装して「判断しました
&マッチしましたorしません」と言うか、「おまかせでお願いします」
と言うか選べるようにしていただいて
「おまかせ」の時には FsRtlIsNameInExpression を呼んでいただく
みたいな感じで。
おそらく、今の感じですと1回ずつユーザーモードとカーネルモードを
行ったりきたりしているんですよね。
機能リストもありがとうございます。
今後リクエストさせていただく際に参考にさせていただきます。
私が考えていることは枝葉のことだったりファイルシステムドライバ
としてはやりすぎだったりするかもしれないことばっかりなのですが。
WindowsのIoマネージャは、ユーザが入力したワイルドカードそのものではなくてそれを多少変換したようなものをファイルシステムドライバに渡してきます。その変則バージョンのワイルドカードマッチに対応したのがFsRtlIsNameInExpressionで、ユーザの入力そのもののワイルドカードマッチングを行うのがPathMatchSpecです。
Dokanでは、FsRtlIsNameInExpressionに相当する処理をユーザモードで実装しています。Ioマネージャは、ファイルシステムにあるパスとワイルドカードパータンにマッチングするファイル一覧を要求してきます。Dokanでは、パスとワイルドカードパターンをユーザモードに渡して、Dokanのユーザモードライブラリでマッチングを行って、マッチするものだけをカーネルモードに返しています。これだとユーザモードからカーネルモードへの通信量が減り効率がよいのです。ユーザモードからカーネルモードのFsRtlIsNameInExpressionを呼ぼうとするとカーネルモードとユーザモードの遷移コストがかかります。
ちなみにDokanでは、FindFilesとFindFilesWithPatternという2つの方法をファイルシステムに提供しています。FindFilesWithPatternは、ファイルシステムを作る人がマッチングまで制御したいときに使います。FindFilesはDokanにマッチングをお任せします。
せっかく詳しく説明していただいているのに
ピンと来ず、実際に .net 版でファイルシステムを
実装してみました。
ご説明いただいたこともドキュメントに書いてあることも
おそらく理解できるようになったと思います。
なるほど、FindFiles メソッドのコールバック中は
ユーザーモードとカーネルモードを行ったりきたりしないのですね。
なので都度 FsRtlIsNameInExpression を呼び出すような
実装にはならない、ということなんですね。
ありがとうございます。