/ 最近 .rdf 追記 編集 設定 本棚

脳log[20200823] 上書き禁止と排他制御と編集禁止



2020年08月23日 (日)

最終更新: 2020-08-26T10:30+0900

[SakuraEditor] 上書き禁止と排他制御と編集禁止

 CDocLocker とは

ある時点でのファイルへの書き込みアクセスの可否を保存し、エディタの「上書き禁止モード」を体現するクラス。CDocLocker::IsDocWritable が第一義。

  1. 書き込みアクセスができた
  2. CDocLocker.IsDocWritable(); // true
  3. 上書き禁止モードではない

 上書き禁止モードと排他制御

排他制御を行うのに書き込みアクセスは必須ではない。しかし書き込みアクセスができることをエディタは条件にしている。自身が書き込みできないファイルに対して「お前らこのファイルは俺のものだぞ。勝手に読んだり書いたりするなよ」と主張することのナンセンスを考えれば納得できる。

書き込みアクセスがないなら排他制御はやめとこか、くらいの温度感なので、CDocLocker.IsDocWritable() に基づいて判断を下している。今現在の瞬間の書き込みアクセスを条件にしているわけではない。

 上書き禁止モードと編集禁止(※編集禁止は状態としてはビューモードと同じ)

「上書き禁止検出時は編集禁止にする」というオプションによって、上書き禁止モードがより制限の強い編集禁止状態へと格上げされる。

(別のファイルとして保存するために)上書きできなくても編集はしたいという考えも、上書きできないのなら編集できても意味がないという考えもどちらもあるだろう。そこはどちらでもいい。

 上書き不可の検出タイミングについて考えたい

これは CDocLocker.IsDocWritable() の値が変化しうるタイミングと同義。次のようになっている。

  • ファイルを開いたあと
  • ファイルを開き直したあと
  • ファイルを保存したあと
  • 排他オプションの設定(しない/上書きを禁止する/読み書きを禁止する)を変更したとき
  • ビューモードのオンオフを切り替えたとき
  • タイマーで外部からのファイル更新を監視するついで(※)

※ 最後だけは「書込禁止の監視を廃止(復活させるなら「更新の監視」付随ではなく別オプションにしてほしい)」というコメントとともに無効化されている。

上書き禁止モードの変化が排他制御を試みるかどうかと編集禁止モードのオンオフに影響するのはすでに書いた。

  1. 排他オプションを変更したときに上書き可否を改めて検知しているのは理に適っている
  2. 「上書き禁止検出時は編集禁止にする」にチェックを入れたときに上書き禁止モードのオンオフを改めようとしないのは、排他オプションの場合と比較してちぐはぐ。
  1. ファイルを開き直したあとの上書き禁止モード改め時には「すでに編集できない状態ならファイルロックのメッセージを表示しない」という再メッセージ抑制策がとられている。
  2. ビューモードをオフにしたときには、何度でも「ファイルがロックされている(上書きが禁止されている)」というようなメッセージが出る。モードの切り替えとファイルの開き直しを比較して、メッセージ抑制策の有無の分かれ目とは?

2組の比較を挙げたけども、どうにも扱いがちぐはぐで行き当たりばったり感がある。上書き禁止がいつ検知・再検知されるのか、すっきり説明できるようにしたい。

 再検知により上書き禁止モードがオフからオンになることについて

オプションにより編集禁止モードと連動する。ファイルを開いたときに上書き可否を検知し編集が禁止されるのは、ユーザーの選択でもありなんの問題もない。

しかし一度編集を開始したファイルに対して、アンドゥバッファが溜まり更新フラグが立ったファイルに対して、先ほど挙げた再検知タイミングを挟んで、上書き不可が検知され編集が禁止される事態が起こりうる。これはユーザーの望む動作であろうか。いたずらにユーザーの操作を制限しているだけではないのか。

ビューモードをオンオフするタイミング次第でエディタが編集可能になったり不可能になったりするようなことを誰が望んでいるのか。結局のところ編集禁止の根拠となっている上書き禁止モード、つまりは書き込みアクセスができたかどうかは、過去のある時点ではそうだったというだけなのに。

 上書きができないことと上書き禁止モードの差

ファイルの保存をしようとしてその直前のテストで書き込みアクセスが拒否されたところに、こういうコメントがあるのがおもしろい。「たとえ上書き保存の場合でもここでの失敗では書込み禁止へは遷移しない

上書き禁止モードを体現する CDocLocker.IsDocWritable() の値が変化しうるタイミングをいくつかすでに挙げたけども、実際に上書き保存をする直前というタイミングがそのリストから明示的に除外されていることになる。

実際上の理由はわかる。最初の上書き失敗を理由にして2回目以降のトライを勝手に諦めてもらっては困るからだ(上書き禁止モードで上書き保存は選べない)。

上書き禁止モードが何ではないのかがよくわかるコメントではないか。

 ビューモードと上書き禁止モード(と編集モード)の差

  • ビューモードはユーザーがオンオフできるが、上書き禁止モードは自動で発動する。

なお、自動で発動する上書き禁止モードをビューモード相当の制限に格上げすることができる(「上書き禁止は編集禁止」オプション)。

 上書き禁止モードをユーザーがオンオフできてもいいのでは?

上書き禁止モードを仮にユーザーがオフにしたところで、上書きできないときには上書き保存に失敗するだけのことだ。ついさっき挙げた、この失敗から上書き禁止に遷移はしない、というコメントの状況が発生するだけのことだ。

ビューモードほど強い制限でなく、ファイルシステムからの要請でもなく、ユーザーが自分の意思でこのファイルには上書きしないと宣言するモード(上書き禁止モード)があってもいいのでは?

 ビューモードをオフにする行為とは?

派生して、ビューモードをオフにするタイミングで書き込みアクセスの可否を再判定して、上書きモードのオンオフを更新する現在の挙動についても再考する。

上書き禁止モードは結局のところエディタやユーザーの選択の結果でしかない。書き込みアクセスが拒絶されたとて、そうあらねばならないモードではない。

ビューモードのオンオフ、上書き禁止モードのオンオフという操作によりユーザーが3つのモードを自在に行き来する状況を想定すれば、ビューモードのオフは編集モードへの移行であるべきでは?

 上書き禁止は編集禁止、あらため、上書き禁止はビューモード

ファイルを開いた際にユーザーの便宜のために自動で上書き禁止モードやビューモードを適用する機能があっていい。今は何が違うかというと……

  • 上書き禁止モードへの移行を拒否できない。
  • 上書き禁止モードが任意でオフにできない。
  • 「上書き禁止は編集禁止」オプションが文字通りの意味であり、上書き禁止モード(編集は可能)が上書き禁止モード(編集も禁止)によって上書きされている。
  • 上書き可否検出タイミングが場合により不合理(一度テキスト編集を開始したあとで編集を禁止されることになると……)。

 サクラエディタでファイル(テキストファイル等)を開くとファイルの更新日時が変更されてしまいます。

せっかくなので理解した内容を長々書いてきたけどもそちらは本題ではなく、そもそもは標記の現象のための作業をしていた>コード。それで何か嬉しいことができたかというとそういうことはない。現在のステータス……

  • 書き込みアクセスの要求が原因だとは決まっていない。
  • 予備的に書き込みアクセスを要求しないようにコードを修正しても、排他制御の判断と、上書き禁止は編集禁止オプションと、文字列展開のためにはやっぱり必要。
  • 書き込みアクセスを確認する、より穏当な代替手段を探しては?
  • ファイルを保護するというお節介ソフトの挙動をそういうものだと受け入れては?