ファイル削除No.08088
jun1 さん 19/09/10 01:42
 
ファイル削除時にダイアログが出ない設定で使っています。
起動時は問題ないのですがなにがトリガーになるか
まったくつかめずにいるのですが、
「ファイルの削除ダイアログ
 このファイルを完全に削除しますか?
 はい/ いいえ」
「複数ファイルの削除
 これらの13個の項目を完全に削除しますか?
はい/いいえ」
のダイアログが出るようになり、その秀丸ファイラーウインドウ
を終了しなければこのダイアログは、ファイル削除時に出続けます。
なお、同時に起動しているほかのウインドウの
秀丸ファイラーでは、削除をしてもダイアログが出ません。

ずっと以前から出ているのですが(私がお願いしたあとの
アップデートをしてからしばらくたってから出はじめたと
思うのですが…)、トリガーが特定できず報告をしていませんでした。

なんらかの対策があればうれしいのですが。

[ ]
RE:08088 ファイル削除No.08089
秀丸担当 さん 19/09/10 09:37
 

まず、ごみ箱のプロパティで確認メッセージの表示がOFFでも、秀丸ファイラーClass
icでは通常独自の問い合わせが出るようになっています。
[ツール]→[オプション]→[安全操作]→[削除の確認メッセージをごみ箱の設定がOFF
の場合独自に表示する]が通常ではONですが、これは既にOFFにされているということ
かと思います。

「完全に削除しますか?」という文面が含まれるメッセージは、秀丸ファイラーClas
sicには無いので、Windows標準のエクスプローラと同等の問い合わせだと思います。

この文面があるメッセージは、ごみ箱に入らないときにWindowsによって出るようです。
完全に削除されるときは「削除の確認メッセージを表示する」がOFFでも出ます。
USBメモリやネットワークのファイルではごみ箱に入らないです。
Shiftキーを押しながらの削除でもごみ箱に入らないです。

例えば1つのウィンドウではUSBメモリを開いていて、別のウィンドウではローカル
ディスクを開いているときに、そのような挙動に見えることはあるかもしれないです。
他にもあるかわからいですが、何らかの理由でごみ箱に入らないタイミングのときに
そうなっていると思うので、そのあたりを確認してみるといいと思います。

[ ]
RE:08089 ファイル削除No.08090
jun1 さん 19/09/10 18:23
 
>[ツール]→[オプション]→[安全操作]→[削除の確認メッセージを
>ごみ箱の設定がOFFの場合独自に表示する]が通常ではONですが、
>これは既にOFFにされているということかと思います。
そのとおりです。

>USBメモリやネットワークのファイルではごみ箱に入らないです。
USB接続ではないですがeSATAドライブがあります。
これかな? 注意してみます。

>Shiftキーを押しながらの削除でもごみ箱に入らないです。
ありゃ? 削除のショートカットキーがShift+Dだったり
します。こ、これは関係ないですよね……。
Ctrl+Dにもキーを割り当てているので、指が勝手に動かないかぎり
こちらを使います。

新規投稿にするまでもない内容なので。
「設定内容の保存/復元」で保存時に同名のファイルへの上書き
確認メッセージがないです。私はなくてかまわないですが、
一応上書き確認を入れたほうがよいかな、と。

[ ]
RE:08090 ファイル削除No.08091
秀丸担当 さん 19/09/11 08:40
 

キー割り当てがShift+Dの場合は、ごみ箱に入らない削除で、問い合わせは出てしま
います。
割り当てする場合は、Shiftを使わないCtrl+Dのほうがいいと思います。

「設定内容の保存/復元」の上書き確認はその通りでした。
ご指摘ありがとうございます。
修正させていただきます。

[ ]
RE:08091 ファイル削除No.08093
jun1 さん 19/09/11 17:55
 
>割り当てする場合は、Shiftを使わないCtrl+Dのほうがいいと思います。
そうでしたか! ダイアログが出ない場合のほうが多いのですけども、
OS(Win10)の気まぐれなのかもしれませんね。ずっと以前から
Shift・Ctrlともにキー割り当てしてあるので、あとは自分の問題。

[ ]
RE:08093 ファイル削除No.08102
jun1 さん 19/09/13 04:38
 
>Shift・Ctrlともにキー割り当てしてあるので、あとは自分の問題。
として終わるつもりが、Win10デフォルトファイル操作、
とくに削除は前処理が多く表示されるためかものすごく時間が
かかる印象(実際、とくにいくつかファイルが入った
ディレクトリ削除は遅い)。

// - 蛇足
秀丸ファイラーClassicの最終的な目標が、前のバージョンの
エクスプローラとの差を吸収+αで以前からのWin者を助ける、
ドキュメントから勝手に推測してるです。
前バージョンエクスプローラ・現状エクスプローラの
両者いいとこ取りだからこそ現状OSでの昔でいうルック&フィール?
から外れない開発をなされていると邪推してたり。
なのでOS?デフォルトのListView?からそう外れない=
今(まで)の開発と今後の互換性から考えたら…とかいろいろ。
// - 蛇足終了

さて、数行空行ができて申し訳ないです。
OSの処理が遅いのでなんとか速くならないか、という話です。
前提として、削除はゴミ箱に入れない、問い合わせされない設定を、
Win10ゴミ箱、秀丸ファイラーでしてあるつもり。

速くできる案として、
どこかの設定を変えてくれ、
秀丸さんが独自で実装していただく、
外部のアプリ、例えばFastCopyなどに渡す、
が簡単に思いつくですが、実際どんなもんでしょう?

[ ]
RE:08102 ファイル削除No.08105
秀丸担当 さん 19/09/13 10:36
 

ごみ箱に入れない削除のコマンドとして、キー割り当てに「削除(ごみ箱に入れな
い)」がありますが、これは常に問い合わせが出るものになっています。

Windowsのエクスプローラと同等削除処理を使わず直接削除するという設定やコマン
ドはありません。

直接削除するには、スクリプトでなんとかする方法があります。
FileSystemObjectを使って削除すると素早く削除できると思います。(長いので後で
書きます)

または、コンテキストメニューの特定の項目をキー割り当てする方法もあります。
適当なファイルを選んだ状態で、ブックマークやツール項目の追加で、パスの部分の
右の「>>」をクリックして、「コマンド(コンテキストメニュー)(7)...」を選びます。
するとコンテキストメニューの候補が出るので、例えば「削除 (FastCopy)」を選ぶ
と、一行のスクリプト化されます。
ブックマークやツール項目をキー割り当てしておくと、メニューを出さずにすぐに呼
べます。

キー割り当ては、[ツール]→[キー割り当て...]でもできますが、順番が入れ替わっ
たりでずれる可能性があるので、ブックマークのプロパティでキー割り当てしたほう
が安全です。
ブックマークのプロパティで「オプション(O)>>」ボタンを押すと、そこでキー割り
当てができます。


---------------
●FileSystemObjectを使ったスクリプトで削除する例
ブックマークまたはツール項目で、パスの部分に例えば「js:C:\Test\Deletefile.j
s」としておきます。

C:\Test\Deletefile.jsというファイルの内容は以下のようにします。

//Deletefile.js
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var c = GetSelectedCount();
if( c == 0 ) {
    Message("選択がありません");
    EndMacro();
}
var aFiles = new Array(c);
var iFile = 0;
var iFocus = GetNextItem(-1,1);
var cItemBeforeFocus = 0;
var iItem = GetNextItem(-1,2);
var fErr = 0;
while( iItem >= 0 ) {
    var strPath = GetItemPath( iItem );
    if( strPath == "" ) {
        fErr = 1;
        break;
    }
    aFiles[iFile] = strPath
    if( iItem < iFocus ) {
        cItemBeforeFocus ++;
    }
    iItem = GetNextItem( iItem, 2 );
    iFile ++;
}
iFile = 0;
while( iFile < c ) {
    var strPath = aFiles[iFile];
    if( objFSO.FolderExists( strPath ) ) {
        objFSO.DeleteFolder( strPath );
    } else {
        objFSO.DeleteFile( strPath );
    }
    iFile ++;
}
if( fErr ) {
    Command("削除");
}
Refresh( 1 );
SelectItem( iFocus - cItemBeforeFocus );  //元のフォーカスに近い場所を選択す
る場合

[ ]
RE:08105 ファイル削除No.08109
jun1 さん 19/09/14 16:35
 
>ごみ箱に入れない削除のコマンドとして、キー割り当てに「削除(ごみ箱
はい。キー割り当てはこれを指定しており、出た問い合わせのオプション
で問い合わせせずに削除になっています。

>直接削除するには、スクリプトでなんとかする方法があります。
>FileSystemObjectを使って削除すると素早く削除できると思います。
3行目でなぜかエラーが。
>var c = GetSelectedCount();

>スクリプトc:\ap\file\hmfiler\script\DeleteFile.js
>行:3
>文字:1
>エラー:オブジェクトを指定してください。
>コード:800A138F
>ソース:Microsoft JScript 実行時エラー
はて? おかしなところがあると思えないのですけどもorz

[ ]
RE:08109 ファイル削除No.08110
ラフ さん 19/09/15 13:51
 
>3行目でなぜかエラーが。
>>var c = GetSelectedCount();
>
>>スクリプトc:\ap\file\hmfiler\script\DeleteFile.js
>>行:3
>>文字:1
>>エラー:オブジェクトを指定してください。
>>コード:800A138F
>>ソース:Microsoft JScript 実行時エラー
>はて? おかしなところがあると思えないのですけどもorz
このエラーは秀丸ファイラーClassic用のスクリプトを秀丸ファイラーClassic外で起動
(ファイル一覧でダブルクリックした時など)に出るエラーです。
つまりWscriptが処理している状態。
WscriptはGetSelectedCountを知らないということ。

秀丸担当さんのスクリプトの
>ブックマークまたはツール項目で、パスの部分に例えば>「js:C:\Test\Deletefile.
>js」としておきます。
をやってブックマークまたはツールから起動してれば出ないはず。

[ ]
RE:08110 ファイル削除No.08111
jun1 さん 19/09/16 11:03
 
>>3行目でなぜかエラーが。
>WscriptはGetSelectedCountを知らないということ。
>>ブックマークまたはツール項目で、パスの部分に例えば>「js:C:\Test\Deletefile.
>js」としておきます。
>をやってブックマークまたはツールから起動してれば出ないはず。
ブックマークに入れてあるのですけれども……。
おかしいかなぁ?


[ ]
RE:08111 ファイル削除No.08112
jun1 さん 19/09/16 11:05
 
>おかしいかなぁ?
先頭に「js:」をつけ忘れていました。
失礼いたしました。

[ ]
RE:08112 ファイル削除No.08113
秀丸担当 さん 19/09/17 09:28
 

ラフさんご指摘の通り、ブックマークの先頭に「js:」を付ける必要があります。
または「script:」でもいいです。
パスの右側の「>>」ボタンから「スクリプトの参照(5)...」でファイルを指定すると、
自動的に「script:」が付きます。

ちなみに、スクリプト自身でWScript上で実行されているかどうかを判断する方法が
あって、スクリプトの先頭に以下のように書いておくと判断できたりします。
strWScriptType = typeof( WScript );
if( strWScriptType.toLowerCase() == "object" ) {
  WScript.Echo( "WScript上で実行中" );
  WScript.Quit();
}

ライブラリに公開しているスクリプトはこういう判断を入れたりしているのですが、
フォーラムにサンプルを書くときも混乱しないようにこの判断を入れるように気を付
けます。

[ ]
RE:08113 ファイル削除No.08118
jun1 さん 19/09/19 06:54
 
理解していたつもりだったんですが、記述を忘れていました。

スクリプトで消すと処理が速いですけど、
OSの削除と違っていったん全画面再描画がかかっちゃうんですね。
なんか、とても惜しい。

[ ]
RE:08118 ファイル削除No.08120
秀丸担当 さん 19/09/19 09:26
 

画面を書き換えているのは、スクリプトの最後に「最新の情報に更新(フォーカス)」
コマンドに相当することを実行しているからでした。
最後の2行の以下のところです。

Refresh( 1 );
SelectItem( iFocus - cItemBeforeFocus );  //元のフォーカスに近い場所を選択す
る場合

これは別に無くてもいいのですが、無い場合は、更新するのが受動的になるので、す
ぐ更新するようにしたのですが、「最新の情報に更新(ファイル一覧差分)」コマンド
のほうがよかったです。
最後の2行は消して、以下のようにするといいです。

Command("最新の情報に更新(ファイル一覧差分)");

[ ]
RE:08120 ファイル削除No.08123
jun1 さん 19/09/19 11:23
 
趣旨違いです。

>Command("最新の情報に更新(ファイル一覧差分)");
Command()は「コマンド一覧」に書かれている文字列を
そのまま渡せばいいだけでしたか!
おもしろいのでいろいろと遊んでみよう〜。
ありゃ? エラーが出ちゃう。なにかつけ忘れか…orz

[ ]
RE:08123 ファイル削除No.08124
秀丸担当 さん 19/09/19 14:53
 

エラーが出るというのが、どういうエラーメッセージが出ているかなど教えてもらえ
ると何かわかるかもしれないです。

1つの事例としては、スクリプトをUTF-8で保存してしまうと、全角文字が解釈でき
ずにうまくいかないということがあります。
スクリプトのファイルは、Shift-JISまたは、UTF-16(BOMあり)である必要があります。

[ ]
RE:08124 ファイル削除No.08126
jun1 さん 19/09/19 19:59
 
>エラーが出るというのが、どういうエラーメッセージが出ているかなど教えてもら
>えると何かわかるかもしれないです。
ご親切にありがとうございます。

>1つの事例としては、スクリプトをUTF-8で保存してしまうと、
これでしたorz

いろいろ遊んでみて、さては目的の処理をと試し、
教えていただいた
Command("最新の情報に更新(ファイル一覧差分)");
に落ち着きました。

最初の
//Refresh( 1 );
SelectItem( iFocus - cItemBeforeFocus );  //元のフォーカスに近い場所を選択
でも同じ結果が得られるので悩みどころ。

[ ]