フォルダ内のファイル名取得No.30243
hirahira さん 07/02/07 13:52
 
初めて投稿します。
秀丸メールにいつもお世話になっています。

業務でのメールは、すべて、業務毎に管理し、
番号と日付曜日、相手先、題名をフォルダの名前にし、
発注者とそれ以外で管理しています。

フォルダの名前は例えば、

001-2007-02-01(木)-○○誰々-題名
002-2007-02-01(木)-○○誰々-題名
003-2007-02-02(金)-○○誰々-題名

発注者-001-2007-02-01(木)-○○誰々-題名
発注者-002-2007-02-01(木)-○○誰々-題名

こんな感じで作成し、それぞれのフォルダにメールのテキストと添付ファイルを保存
しています。

このため、以下のように受信用と送信用にそれぞれマクロを作成し、
日付、曜日、相手先、題名を自動で$NameDayに保存します。

手動で新規フォルダを作成し、$NameDayをCTRL+Vで入力する作業を繰り返しています。


受信用マクロ
loaddll "tkinfo.dll";
if( !result ) {
    message "このマクロは鶴亀メールで実行してください。";
    endmacro;
}
if( !dllfunc("IsTuruKameMain") ) {
    message "このマクロは鶴亀メール本体側で実行してください。";
    endmacro;
}
$year = year;
$month = month;
$day = day;
$dayofweek = dayofweek;
$NumSave="010";
question "発注者ですか?";
if( result == yes ) {
    $NumSave="発注者-010";
}
$subName = dllfuncstr( "CurrentHeader", "subject" );
$fromname = dllfuncstr( "SetNameOnly", $from );
$s = dllfuncstr( "FindBook2", $from);
$NameDay=  $NumSave + "-" + $year + "-" + $month + "-" + $day + "(" + $dayof
week + ")-" + $s + "-" + $subName;
#a = dllfunc("CountCurrentHeader", "X-Attach");
while( #a >= 1 ) {
    #a = #a - 1;

    $Attach = dllfuncstr("CurrentHeader2", "X-Attach", #a );
    if ($Attach=="" ){
        goto LEND;
    }
    //message $Attach;
}
//message $NameDay;
//$s = dllfuncstr("FormatDate", dllfuncstr("RootHeader", "Date"), "YYYY/MM/D
D");
//message $s;
beginclipboardread;
setclipboard $NameDay;

//田楽DLLをload
call Dengaku;
SAVEAS;
//newfile;
goto LEND;

ERROR:
message "何らかのエラーによりマクロを中止します。";
LEND:
    freedll;
    endmacro;

Dengaku:
    //  田楽DLLのロード
//    message hidemarudir;
    if(existfile(hidemarudir+"\\DengakuDLL.dll"))loaddll hidemarudir+"\\Deng
akuDLL.dll";
    else {
        $$mes = "田楽DLLが見つかりませんでした。\n" +
                "田楽DLLを秀丸エディタインストールディレクトリにおいてくださ
い。\n" +
                "  秀丸エディタインストールディレクトリ:\n\t"+hidemarudir +
"\n\n" +
                "田楽DLL ダウンロードURL\n"+
                "  http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgserver/
\n" +
                $info ;
        message $$mes ;
        goto LEND ;
    }

    if (!result) {
        message "田楽DLL をロードできませんでした。"+$info;
        goto LEND ;
    }
return;


この際、フォルダ内ファイル名の頭の番号(001,002,003)の最大値を
取得することは可能でしょうか。

[ ]
RE:30243 フォルダ内のファイル名取得No.30246
秀まるお2 さん 07/02/07 15:49
 
 特定のフォルダに「000...」、「001...」みたいな感じでファイルがあって、
その番号の最終が何か調べるとしたら、それをマクロでやるのは難しいと思いま
す。

 C言語でなるとしたら、FindFirstFile/FindNextFileでファイル名をすべて列
挙させて、そこから一番大きい番号を探す形になりますけど、それではかなり時
間がかかってしまってあんまりよくないです。

 普通こういう処理を作るとしたら、番号を計算させてファイル名を計算した後
に、その番号をどこかに保存しておいて、次回またファイルを生成したくなった
時は、前回覚えておいた番号にプラス1してファイル名を生成してやるって作戦
になると思います。仮にそれでファイル名が重なっていたら、もうプラス1して
やるとか。そういう風にすると完璧な連番には出来ませんけど、処理速度を考え
たら仕方がないと思います。

 ということで、そういうプログラマー向けの話になるのでなんですが…。

 そういう番号を覚えておく作戦を使うのだとしたら、writeininum/getininum
を使えばいいと思います。あと、同じ名前のファイルが既に存在してるかどうか
調べるには、existfile関数があります。

[ ]
RE:30243 フォルダ内のファイル名取得No.30250
h-tom さん 07/02/07 16:25
 

h-tom です。

>この際、フォルダ内ファイル名の頭の番号(001,002,003)の最大値を
>取得することは可能でしょうか。

これはソースの一部なんですかね?
田楽DLLを使っているなら、"EMUFILE"/"EMUDIR"使って、逆順にソートさせれば、
いいかもしれません。
狙ったファイル/フォルダだけを、マッチさせるのが出来ればいいのですが。

まぁ、秀丸おさんのアドバイスにあるように、iniファイル使って管理するのが
いいと思いますよ。

[ ]
RE:30246 フォルダ内のファイル名取得No.30255
hirahira さん 07/02/07 20:29
 
> 普通こういう処理を作るとしたら、番号を計算させてファイル名を計算した後
>に、その番号をどこかに保存しておいて、次回またファイルを生成したくなった
>時は、前回覚えておいた番号にプラス1してファイル名を生成してやるって作戦
>になると思います。仮にそれでファイル名が重なっていたら、もうプラス1して
>やるとか。そういう風にすると完璧な連番には出来ませんけど、処理速度を考え
>たら仕方がないと思います。

なるほど。了解しました。
ご提案頂いた方法で考えてみます。
ありがとうございました。

[ ]
RE:30250 フォルダ内のファイル名取得No.30256
hirahira さん 07/02/07 20:30
 
>田楽DLLを使っているなら、"EMUFILE"/"EMUDIR"使って、逆順にソートさせれば、
>いいかもしれません。
>狙ったファイル/フォルダだけを、マッチさせるのが出来ればいいのですが。
>
>まぁ、秀丸おさんのアドバイスにあるように、iniファイル使って管理するのが
>いいと思いますよ。

h-tomさん、ありがとうございます。
田楽DLLのヘルプを再度参照して、この方法も試してみます。m(_ _)m

[ ]