ファイル名一覧の取得についてNo.03601
舩橋幸雄 さん 03/02/18 17:24
 
舩橋です。

マクロサーバの機能を使って、あるディレクトリ配下のファイル名を、
サブディレクトリ配下も含めて、全て取得したいのですが、サブディレ
クトリの階層が深いと大きな配列が必要になりそうです。

  ┌───────┐
  │             ↓
  │・カレントディレクトリのファイル名一覧を取得する。
  │・サブディレクトリの一覧を配列に記憶する。
  │・カレントディレクトリに移動する。
  │             │
  └───────┘

あまり、配列を大きせずに済む方法はないでしょうか?

[ ]
RE:03601 ファイル名一覧の取得についてNo.03602
ひろ さん 03/02/18 18:25
 
 舩橋幸雄さん今日は、ひろです。
> マクロサーバの機能を使って、あるディレクトリ配下のファイル名を、
> サブディレクトリ配下も含めて、全て取得したいのですが、サブディレ
> クトリの階層が深いと大きな配列が必要になりそうです。
 具体的に何を為たいのか不明なので、使えないかもしれません。

 例えば、ファイルリストを作成するなら、ファイル名を取得する度に、
while(1){
  call GetFileName;
  if( $$return == "" )break;
  insert $$return;
}
という要領で、処理をすればよいのでは? 要は先にファイル名を全て取得する
のではなく、ファイル名を取得→処理、を繰り返す方法です。

[ ]
RE:03602 ファイル名一覧の取得についてNo.03603
舩橋幸雄 さん 03/02/18 19:27
 
舩橋です。
ひろ殿、回答ありがとうございます。

聞きたいことがうまく伝わらなかったようです。

以下のようなコーディング(Helpの例)でカレントディレクトリのサブディレクトリ一
覧を配列に保存します。

ddeexecute "enumdir *.*"
#i = 0
while(1) {
$name[#i] = dderequest( "findnext" );
if( $name[#i] == "" ) break;
#i = #i + 1;
}

次に、

ddeexecute "setcurdir "+$name[0];  

でカレントディレクトリをサブディレクトリに移動します。

次に、サブディレクトリの一覧を採取します。

ddeexecute "enumdir *.*"
#j = 0
while(1) {
$name1[#j] = dderequest( "findnext" );
if( $name1[#j] == "" ) break;
#j = #j + 1;
}

次に、

ddeexecute "setcurdir "+$name1[0];  

でさらにカレントディレクトリをサブディレクトリに移動します。

次に、サブディレクトリの一覧を採取します。

ddeexecute "enumdir *.*"
#k = 0
while(1) {
$name2[#k] = dderequest( "findnext" );
if( $name2[#k] == "" ) break;
#k = #k + 1;
}

といった具合にどんどん、サブディレクトリ名の配列がたまっていきます。
(コーディングの悪さと不正確さは簡便してください。雰囲気を判っていただきたか
っただけなので適当です。)

ファイルに吐き出して、読み直すしか手が無い様な気もしていますが。


> 舩橋幸雄さん今日は、ひろです。
>> マクロサーバの機能を使って、あるディレクトリ配下のファイル名を、
>> サブディレクトリ配下も含めて、全て取得したいのですが、サブディレ
>> クトリの階層が深いと大きな配列が必要になりそうです。
> 具体的に何を為たいのか不明なので、使えないかもしれません。
>
> 例えば、ファイルリストを作成するなら、ファイル名を取得する度に、
>while(1){
>  call GetFileName;
>  if( $$return == "" )break;
>  insert $$return;
>}
>という要領で、処理をすればよいのでは? 要は先にファイル名を全て取得する
>のではなく、ファイル名を取得→処理、を繰り返す方法です。

[ ]
RE:03603 ファイル名一覧の取得についてNo.03604
ひろ さん 03/02/18 19:40
 
 舩橋幸雄さん今日は、ひろです。
> 聞きたいことがうまく伝わらなかったようです。
 私の聞きたいことも上手く伝わらなかったようです。

 私が言いたかったのは、やりたい処理によっては、
> 以下のようなコーディング(Helpの例)でカレントディレクトリのサブディレクトリ一
> 覧を配列に保存します。
というように、配列として保存する必要は無いのではないか? ということです。

 仮に配列に全てのファイル名を保存したとして、そのあとどの様な処理をし
たいのでしょうか?

[ ]
RE:03603 ファイル名一覧の取得についてNo.03605
IKKI さん 03/02/18 19:47
 
>ファイルに吐き出して、読み直すしか手が無い様な気もしていますが。
そうですね…。いちばん素直なのは

  run getenv("ComSpec") + " /c dir /s /b > con";

としてからバッファを煮るなり焼くなりする方法ではないかと思いますが、
どうしても変数に保持する必要があって、かつ配列要素数を減らしたいなら
複数のファイル名を(たとえばカンマ区切りで)連結して1つの文字列に入れてしま
うとか。

[ ]
RE:03604 ファイル名一覧の取得についてNo.03606
舩橋幸雄 さん 03/02/18 21:39
 
舩橋です。

> 舩橋幸雄さん今日は、ひろです。
>> 聞きたいことがうまく伝わらなかったようです。
> 私の聞きたいことも上手く伝わらなかったようです。
>
> 私が言いたかったのは、やりたい処理によっては、
>> 以下のようなコーディング(Helpの例)でカレントディレクトリのサブディレクトリ一
>> 覧を配列に保存します。
>というように、配列として保存する必要は無いのではないか? ということです。
>
> 仮に配列に全てのファイル名を保存したとして、そのあとどの様な処理をし
>たいのでしょうか?

やりたいことは、「あるディレクトリ配下のファイル名を、サブディレクトリ配下も
含めて、全て取得したい」です。
ファイルの一覧リストを作成するのが目的です。
例えば、カレントディレクトリが、"c:\"のとき、Cドライブにある全ての
ファイルのファイル名をテキストファイルに出力するマクロを作成しよう
としています。
(この一覧を別のマクロで読み込んで、別の処理をさせのですが)





[ ]
RE:03606 ファイル名一覧の取得についてNo.03607
でるもんた さん 03/02/18 21:55
 
> やりたいことは、「あるディレクトリ配下のファイル名を、サブディレクトリ配下も
> 含めて、全て取得したい」です。
> ファイルの一覧リストを作成するのが目的です。
> 例えば、カレントディレクトリが、"c:\"のとき、Cドライブにある全ての
> ファイルのファイル名をテキストファイルに出力するマクロを作成しよう
> としています。

とすると、マクロでこまごまとやる必要はないですね。
コマンドプロンプトから
    dir c:\ /s /b > 保存先ファイル名
とタイプすればファイルに保存されます。

どうしても秀丸から処理したければ、IKKI さんが書いている
    run getenv("ComSpec") + " /c dir /s /b > con";
でしょうね。

[ ]
RE:03606 ファイル名一覧の取得についてNo.03608
白雲斎 さん 03/02/19 00:58
 
 白雲斎です。

>> 仮に配列に全てのファイル名を保存したとして、そのあとどの様な処理をし
>>たいのでしょうか?
>
>やりたいことは、「あるディレクトリ配下のファイル名を、サブディレクトリ配下も
>含めて、全て取得したい」です。

ひろさんが尋ねているのは、この先の事ではないでしょうか?

>(この一覧を別のマクロで読み込んで、別の処理をさせのですが)

この「別の処理」と言う部分をお書きになった方がよいのでは・・・

因みに、「Cドライブにある全てのファイル」と言った大掛かりな処理が必要な
ら、秀丸マクロではなく、Ruby や Perl 等をお考えになった方がよいように思
いますがどうでしょう。

[ ]
RE:03606 ファイル名一覧の取得についてNo.03609
杉浦 まさき さん 03/02/19 02:24
 
こんばんは。杉浦 まさきです。

>やりたいことは、「あるディレクトリ配下のファイル名を、サブディレクトリ配下
>も含めて、全て取得したい」です。
>ファイルの一覧リストを作成するのが目的です。
>例えば、カレントディレクトリが、"c:\"のとき、Cドライブにある全ての
>ファイルのファイル名をテキストファイルに出力するマクロを作成しよう
>としています。

手前味噌で恐縮ですが、

loaddll hidemarudir + "\\DengakuDLL.dll";
#r = dllfunc("ENUMPATH", "/f C:\\*.*");
while (1) {
    $file = dllfuncstr("FINDNEXT");
    if ($file == "") break;
    insert "C:\\" + $file + "\n";
}
freedll;
endmacro;

で可能です。

[ ]
RE:03607 ファイル名一覧の取得についてNo.03611
ひろ さん 03/02/19 13:00
 
 舩橋さん今日は、ひろです。
> とすると、マクロでこまごまとやる必要はないですね。
> コマンドプロンプトから
>     dir c:\ /s /b > 保存先ファイル名
> とタイプすればファイルに保存されます。
 この方法だと、ロング・ファイル・ネームが上手く出力できないのが問題な
ら、他のコマンド・ライン・ツールを使うのが最も手っ取り早いです。

 もしマクロでやるとしても、
> やりたいことは、「あるディレクトリ配下のファイル名を、サブディレクトリ配下も
> 含めて、全て取得したい」です。
> ファイルの一覧リストを作成するのが目的です。
というのが目的なら、やはり配列に保存する必要はないと思います。

 ##未だに何をしたいのかよく分からない。

[ ]
RE:03611 ファイル名一覧の取得についてNo.03612
でるもんた さん 03/02/19 13:30
 
> > コマンドプロンプトから
> >     dir c:\ /s /b > 保存先ファイル名
> > とタイプすればファイルに保存されます。
>  この方法だと、ロング・ファイル・ネームが上手く出力できないのが問題な
> ら、他のコマンド・ライン・ツールを使うのが最も手っ取り早いです。

dir でも /b をつければ long filename(だけ)を出力してくれますよ。
(Windows98、Me で確認済)

> ##未だに何をしたいのかよく分からない。

同感。

[ ]
RE:03611 ファイル名一覧の取得についてNo.03613
舩橋幸雄 さん 03/02/19 14:49
 
舩橋です。

杉浦殿に提示していただいたコーディングを流用して、目的のマクロが作成できまし
た。
作成したマクロのコーディング最後に添付しておきます。(参考まで)

何をやりたいか判らないと言われていますので、やりたいことの全体像について説明
します。


更新前のファイル(テキスト形式)と更新後のファイルの比較リストを出力しようとし
ています。

比較リストを出力するために以下のツールがあります。

・更新前後のファイルを突き合わせて差分データを出力するツール(diffです)
・差分データと更新前後のファイルを読み込み比較リストを出力するツール。
   更新前のファイルと更新後のファイルを左右に並べて出力し、
   異なっているレコード(行)を罫線で囲みます。
   長い行は折り曲げ、印刷した際、A3横長サイズの用紙に納まる様にしています。
    (実際は、プリンタの縮小機能を使ってA4横長サイズに印刷していますが。)
・比較リストを読み込んで、更新されていない行をカットしたリストを出力します。
   (リスト先頭10行,最後10行,変更箇所の前後10行は残します)

これらのツールはバッチファイルで動かします。複数ファイルまとめて処理すること
はできません。


比較したいテキストファイルは数十ファイルあります。
また、起点となるディレクトリの下に複数のサブディレクトリを持ち、サブディレク
トリの下にも比較対象のファイルが存在します。
起点となるディレクトリの名称は更新前後で異なりますが、ファイル名やサブディレ
クトリ名は同じです。

比較対象のファイル名を列挙したテキストファイルを読み込み、上記ツールを実行さ
せるバッチファイルを作成するマクロを作成しています。

いままで、比較対象のファイル名を列挙したテキストファイルを手作業でつくってい
ましたが、この作業の自動化を考えていました。



以下は作成したマクロです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
loaddll "DengakuDll";
$dir1 = dllfuncstr("GETDIRNAMEEX",hidemaruhandle(0),"フォルダを指定して下さ
い",$curdir,1);
if( $dir1=="" ){
   freedll;
   endmacro;
}
//#r = dllfunc("ENUMPATH", "/f C:\\*.*");
#r = dllfunc("ENUMPATH", "/f \x22"+$dir1+"\\*.*\x22");

while (1) {
    $file = dllfuncstr("FINDNEXT");
    if ($file == "") break;
//    insert "C:\\" + $file + "\n";
    insert $file + "\n";
}
freedll;
endmacro;




[ ]
RE:03612 ファイル名一覧の取得についてNo.03614
ひろ さん 03/02/19 18:00
 
 でるもんたさん今日は、ひろです。
> dir でも /b をつければ long filename(だけ)を出力してくれますよ。
> (Windows98、Me で確認済)
 出力結果は随分違いますが、確かにできますね。情報有り難うございました。
Windows98 で確認しました。

[ ]