ツリー一覧、ファイル一覧についてNo.05118
SATORU さん 14/10/04 14:09
 
要望です。
秀丸ファイラーClassicで設定したファイル一覧の設定のまま
ツリー一覧、ファイル一覧をテキストエディタに出力出来ない
でしょうか。
コマンドプロンプトのTREEコマンドで同様の一覧が出力
出来ますが、ファイルの詳細までは出力できない為、
要望させて頂きました。

[ ]
RE:05118 ツリー一覧、ファイル一覧についNo.05120
秀丸担当 さん 14/10/06 09:47
 

ファイル一覧については、スクリプトによってテキスト化する方法があります。

詳細表示をTSV化してクリップボードにコピー
http://hide.maruo.co.jp/lib/hmfcscript/copyfiledetailtsv.html

ツリー一覧はできないですが、こちらはtreeコマンドがあるということで、ファ
イル一覧のこの方法でどうでしょうか。

このスクリプトを例えば c:\folder\CopyFileDetailTsv.js に置いておいて、ブ
ックマークの追加で、「パス」の部分に
「js:C:\folder\CopyFileDetailTsv.js」と書いておいて、ブックマークを選ぶ
と実行できます。
「js:」を付けないとエラーになるので注意が必要です。
実行するとクリップボードにコピーされるので、テキストエディタに貼り付けが
できます。

[ ]
RE:05120 ツリー一覧、ファイル一覧についNo.05122
SATORU さん 14/10/06 23:25
 
コメントありがとうございます。
ご提供頂いたモジュールを使用させて頂きました。
1点教えて頂けないでしょうか。
このモジュールの実行結果にファイルのフルパスを
追加する方法はないでしょうか。

[ ]
RE:05122 ツリー一覧、ファイル一覧についNo.05123
秀丸担当 さん 14/10/07 11:06
 

各行の最後にパスを追加するとしたら、スクリプトを編集して、以下のようにす
るといいと思います。

var s="";
var cItem=GetItemCount();
var cCol=GetColumnCount();
for(iCol=0;iCol<cCol;iCol++){
  s=s+GetColumnText(iCol);
  if(iCol<cCol-1)s=s+"\t";
}
s=s+"\r\n";
for(iItem=0;iItem<cItem;iItem++){
  for(iCol=0;iCol<cCol;iCol++){
    s=s+GetItemText(iItem,iCol);
    if(iCol<cCol-1)s=s+"\t";
  }
  s=s+"\t"+GetItemPath(iItem); //追加
  s=s+"\r\n";
}
SetClipboard(s);

[ ]
RE:05123 ツリー一覧、ファイル一覧についNo.05127
SATORU さん 14/10/08 23:26
 

ご回答ありがとうございます。
ご提供頂いたモジュールでサブフォルダの情報も併せて出力できると
目的が達成出来そうです。
難しくなければ教えて頂けないでしょうか。

[ ]
RE:05127 ツリー一覧、ファイル一覧についNo.05129
秀丸担当 さん 14/10/09 12:44
 

サブフォルダもということになると、ちょっとややこしくなります。
フォルダツリーの構造のまま探るとファイルシステムではないフォルダの心配も
あるので、ファイルシステム(パスがあるところ)で探るようなスクリプトにし
てみました。
あと、処理が長い場合中断はできなくて、1000フォルダを超えたら中断するよう
にしてみています。
本当はGetKeyState()でキーの状態を見て中断などもできるのですが、同期的な
取得になるためSleep()を入れたりしないといけなくて遅くなるのでやめました

GetAsyncKeyState()のような非同期でキーの状態を取得できたらいいので、今後
のバージョンでスクリプトのメソッド追加を検討します。


cLimit = 1000;//1000フォルダ以上になったら中断
cAll = 0;
fso = new ActiveXObject("Scripting.FileSystemObject");
var strDir = GetDirectory();
SetClipboard( GetFileListContents( strDir ) );
Open( strDir );
if( cAll >= cLimit ) {
  Message( cLimit+"フォルダ以上になったので中断" );
}

function GetFileListContents( strTarget ) {
  cAll ++;
  if( cAll >= cLimit ) return "";
  var s = "";
  Open( strTarget );
  s += strTarget + "\r\n";
  var cItem=GetItemCount();
  var cCol=GetColumnCount();
  for(iCol=0;iCol<cCol;iCol++){
    s+=GetColumnText(iCol);
    if(iCol<cCol-1)s+="\t";
  }
  s+="\r\n";
  for(iItem=0;iItem<cItem;iItem++){
    for(iCol=0;iCol<cCol;iCol++){
      s+=GetItemText(iItem,iCol);
      if(iCol<cCol-1)s+="\t";
    }
    s+="\t"+GetItemPath(iItem); //追加
    s+="\r\n";
  }
  s+="\r\n";
  //
  var objFolder = fso.GetFolder(strTarget);  
  var col = new Enumerator(objFolder.SubFolders);
  for (col.moveFirst(); !col.atEnd(); col.moveNext()) {
    s+=GetFileListContents( strTarget + "\\" + col.item().Name );
  }
  s += "\r\n";
  return s;
}

[ ]
RE:05127 ツリー一覧、ファイル一覧についNo.05131
秀丸担当 さん 14/10/10 14:56
 

Escキーで中断することもできるように、今後のバージョンを検討しようとして
いましたが、現状のバージョンでもできることがわかりました。
GetKeyStateの第二パラメータに2を指定すると非同期に取得できるようになって
いました。
1000フォルダの上限は付けず、以下のようなスクリプトのほうがよかったです。



fAbort = 0;
fso = new ActiveXObject("Scripting.FileSystemObject");
var strDir = GetDirectory();
if( strDir ) {
  SetClipboard( GetFileListContents( strDir ) );
  Open( strDir );
}
if( fAbort ) {
  Message( "中断しました" );
}

function GetFileListContents( strTarget ) {
  if( CheckAbort() ) return "";
  var s = "";
  Open( strTarget );
  s += strTarget + "\r\n";
  var cItem=GetItemCount();
  var cCol=GetColumnCount();
  for(iCol=0;iCol<cCol;iCol++){
    s+=GetColumnText(iCol);
    if(iCol<cCol-1)s+="\t";
  }
  s+="\r\n";
  for(iItem=0;iItem<cItem;iItem++){
    if( CheckAbort() ) return "";
    for(iCol=0;iCol<cCol;iCol++){
      s+=GetItemText(iItem,iCol);
      if(iCol<cCol-1)s+="\t";
    }
    s+="\t"+GetItemPath(iItem);
    s+="\r\n";
  }
  s+="\r\n";
  //
  var objFolder = fso.GetFolder(strTarget);  
  var col = new Enumerator(objFolder.SubFolders);
  for (col.moveFirst(); !col.atEnd(); col.moveNext()) {
    s+=GetFileListContents( fso.BuildPath( strTarget, col.item().Name )
);
  }
  s += "\r\n";
  return s;
}

function CheckAbort() {
  if( fAbort ) return 1;
  if( (GetKeyState( 0x1b, 2 ) & 0x8000) != 0 ) {
    Message("");
    fAbort = 1;
    return 1;
  }
  if( (GetKeyState( 0x01, 2 ) & 0x8000) != 0 ) {
    fAbort = 1;
    return 1;
  }
  return 0;
}

[ ]
RE:05131 ツリー一覧、ファイル一覧についNo.05132
SATORU さん 14/10/11 01:24
 

ご提供頂いたモジュールを実行したところ、
目的の情報を出力することが出来ました。
手厚いご対応ありがとうございました。

[ ]