sakura-editor / sakura

SAKURA Editor (Japanese text editor for MS Windows)
https://sakura-editor.github.io/
Other
1.23k stars 162 forks source link

未保存のファイルがあるとすでに閉じたファイルの存在するディレクトリを削除できない #291

Open m-tmatma opened 6 years ago

m-tmatma commented 6 years ago

未保存のファイルがあるとすでに閉じたファイルの存在するディレクトリを削除できない

未保存のファイルのカレントディレクトリが(※) で開いたファイルの存在するディレクトリに なっているために削除できないのだと思う

rom-k commented 6 years ago

横からすみません。 少し見させていただいたのですが、ご認識のとおり CDocEditor::OnAfterLoad() の SetCurrentDirectory() にて、(※) で開いたファイルの親ディレクトリのハンドルが保持されてしまうことが原因のようです。 SetCurrentDirectory() を使う以上はハンドルを保持する動作は避けられないようですので、根が深そうです。 cf. https://blogs.msdn.microsoft.com/oldnewthing/20101109-00/?p=12323

berryzplus commented 6 years ago

@rom-k さん 参考情報あざっす。

極論するとギリギリのタイミングまで SetCurrentDirectory しなければいいだけなので、対応は可能だと考えています。

呼んだらアウトなんだから、呼ばなきゃいいのです :smile:

あ、なんかsympathy...orz

ds14050 commented 6 years ago

素朴な疑問ですが、使用中のディレクトリが削除できないのは問題でしょうか。使用しつつ削除できるに越したことはありませんが、そうでないならば。

ドキュメントプロセスのカレントディレクトリは、マクロの実行フォルダであったり、保存する際の初期フォルダであったりという形で使用されているかと思います。どのドキュメントプロセスから新規作成したファイルであるかは無視してほしくありません。テキストファイルだからと常にマイドキュメントに保存しようとするエディタは馬鹿です。

m-tmatma commented 6 years ago

素朴な疑問ですが、使用中のディレクトリが削除できないのは問題でしょうか。使用しつつ削除できるに越したことはありませんが、そうでないならば。

使用しているというのは単に sakura editor の内部構造の話なだけで、 ユーザーからしたら、すでに閉じているファイルのディレクトリなので 使用中ではないディレクトリが削除できないように見えます。

ds14050 commented 6 years ago

無題ドキュメントが使用しているのでは?ということです。

kobake commented 6 years ago

無題ドキュメントがどこのディレクトリを Current Directory にしているかというのはユーザ目線では分かりようが無いので、該当ディレクトリは消せるようになっていてほしいですね・・・

ドキュメントプロセスのカレントディレクトリは、マクロの実行フォルダであったり、保存する際の初期フォルダであったりという形で使用されているかと思います。どのドキュメントプロセスから新規作成したファイルであるかは無視してほしくありません。テキストファイルだからと常にマイドキュメントに保存しようとするエディタは馬鹿です。

「カレントディレクトリ」以外の仕組みでディレクトリ情報をどこかに保持しておけば良いのでは、と思います。

berryzplus commented 6 years ago

「カレントディレクトリ」以外の仕組みでディレクトリ情報をどこかに保持しておけば良いのでは、と思います。

既にそういう構造だった気がします。 ちょっと今確認できないですが CEditDoc あたりにパスを保持する変数がいた気がします。 ※CEditDocは依存クラスが多いので、依存クラスのどれかだったかもしれないです。

なので、必要になるまでカレントディレクトリをセットしない対応は可能なはずです。

排他ロックなしモードで編集中ファイルがフォルダごと削除された場合の挙動としては、 ディレクトリを復活させるのではなく、設定した初期保存用ディレクトリを表示するのがよい気がします。

ds14050 commented 6 years ago

共通設定>編集>ファイルダイアログの初期位置、が

の3択です。

保存していないドキュメントで実行されるマクロの実行場所にこだわりはありませんが(※普通こだわりようがない)、最初にどこに保存しようとするかは手間の軽減に大いに寄与します。その実現方法はなんであってもいいと思っています(カレントフォルダのようでカレントフォルダでなくても)。

この2つ以外のどこにカレントディレクトリが影響するかは未知です。

kobake commented 6 years ago

なるほど。カレントディレクトリをユーザに意識させるような仕様が既にあるんですね。でもこの仕様自体があまりイケてないですね。意識させるならせめてそれを表示させる等が必要で、ユーザの脳内メモリにそれを任せるのはさすがに解せぬという感じです。

ただ、カレントディレクトリ相当の何かしらはたしかにあったほうが便利であることにも同意です。何かしら良い案を考えます (「カレントフォルダ」という言い回しと実装を変えれば良いだけな気がしますが良い言い回しがすぐには思いつきませんね)

ds14050 commented 6 years ago

保存していないドキュメントで実行されるマクロの実行場所にこだわりはありませんが(※普通こだわりようがない)

「普通」でない場合というのはたとえば、作業フォルダを指定したショートカットでエディタを起動した場合でしょうか。ここにはユーザーの意図があります。デフォルトの保存場所として FAQ で誘導されてもいます(FAQ > 21 新規ファイルのデフォルトの保存先を変更するには)。

「カレントフォルダ」という言い回しと実装を変えれば良いだけな気がしますが良い言い回しがすぐには思いつきませんね

たとえば「ドキュメントフォルダ」「テキストフォルダ」「ファイルフォルダ」のような名前であれば、保存済みのドキュメントに関してはカレントフォルダの意味を保ったまま、未保存のドキュメントの場合がどこであるかは曖昧です。

berryzplus commented 6 years ago

@ds14050 さん

共通設定>編集>ファイルダイアログの初期位置、が •カレントフォルダ

詰んだじゃないですかw

作業フォルダに指定されたフォルダが存在しない場合(=起動後に消された)、 「作業フォルダxxxは存在しません。作成しますか?」みたいに問い合わせするのが 親切な気がしてきました。

kobake commented 6 years ago

「カレントフォルダ」「カレントディレクトリ」という言い回しがプログラマチックすぎるので、「作業フォルダ」と言われたら一般ユーザの一部もたしかに理解してくれそうな概念ですね。

タイトルバーに現在の作業フォルダを表示する、みたいなことをしていれば、ユーザとしては、「あぁこのフォルダが消せないのはあの無題のサクラエディタが作業フォルダを掴んでいるのか」と理解して対応しやすくはなると思いました。

もしくは「作業フォルダ」といいつつ、実際の実装ではエディタ起動時の current directory をどこかに保管はした上で、current directory は別の場所(たとえば sakura.exe の場所等)に変更してしまうようなことをしてしまえばディレクトリ消せない問題も回避できます。

仮に作業フォルダへ保存するつもりが保存時にはそのフォルダが存在しなくなっていた場合、その親フォルダ、さらにそれも存在しなかったらさらにその親フォルダ、ぜんぶ存在しなかったら何かしらデフォルトのフォルダ(例えばマイドキュメントとか)を保存ダイアログの初期ディレクトリとして設定してあげるのか親切かなと思いました。

usagisita commented 2 years ago

これなんですが、サクラエディタは各所で内部でカレントディレクトリ=ファイルのディレクトリであることを暗黙的に利用しているようです。 例えば、タグジャンプは相対ジャンプで移動できますが、これはカレントディレクトに対する相対パスです。 Grepの「現フォルダ」ボタンもファイルを開いていなければカレントディレクトリを見ているようです。 外部コマンド実行の「カレントディレクトリ」もオプションを指定しなければ、現在のカレントディレクトリを保持するはずです。 これにより相対パスで「dir」とかが実行できるので、なんらかのケアが必要な個所は思ったより多いという印象です。 もちろん、該当箇所がすべて把握できているのであれば、そこで相対パスと絶対パスの変換などをすればいいので、問題は解決します。