Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
m-tmatma opened this issue Jul 20, 2018 · 13 comments
Labels
enhancement ■機能追加

Comments

@m-tmatma
Copy link
Member

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

  • 任意のフォルダにファイルを作成する
  • そのファイルを sakura editor で開く (※)
  • sakura editor から 新規作成でファイルを作成してファイルを保存しないままにしておく
  • (※) で開いたファイルを閉じる
  • (※) で開いたファイルの存在するディレクトリをエクスプローラ等で削除を試みる
  • 使用中なので削除できないというメッセージが出る。
  • 新規作成で作った未保存のファイルを一旦保存すると (※) で開いたファイルの存在するディレクトリを削除できる。

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

@rom-k
Copy link

rom-k commented Aug 3, 2018

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

@berryzplus
Copy link
Contributor

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

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

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

あ、なんかsympathy...orz

@ds14050
Copy link
Contributor

ds14050 commented Aug 6, 2018

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

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

@m-tmatma
Copy link
Member Author

m-tmatma commented Aug 6, 2018

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

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

@ds14050
Copy link
Contributor

ds14050 commented Aug 7, 2018

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

@kobake
Copy link
Member

kobake commented Aug 7, 2018

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

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

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

@berryzplus
Copy link
Contributor

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

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

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

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

@ds14050
Copy link
Contributor

ds14050 commented Aug 8, 2018

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

  • カレントフォルダ
  • 最近使ったフォルダ
  • 指定フォルダ

の3択です。

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

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

@kobake
Copy link
Member

kobake commented Aug 8, 2018

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

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

@ds14050
Copy link
Contributor

ds14050 commented Aug 8, 2018

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

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

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

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

@berryzplus
Copy link
Contributor

@ds14050 さん

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

詰んだじゃないですかw

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

@kobake
Copy link
Member

kobake commented Aug 9, 2018

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

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

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

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

@KENCHjp KENCHjp added the enhancement ■機能追加 label Sep 2, 2018
@usagisita
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement ■機能追加
Projects
None yet
Development

No branches or pull requests

7 participants