日付順にGREPした時に、ファイルの更新日No.39519
styth さん 22/01/20 12:18
 
 以前にGREPした時に、ファイルの更新日付も表示させるマクロを教えて頂きま
した。https://www.maruo.co.jp/hidesoft/2/x39335_.html#39340
 最近のバージョンでは、出力形式に「日付順」というものが、追加されていま
す。
 ここに、更新日付も表示させるというオプションを追加して頂くというわけに
はいかないでしょうか?
 その方が処理が早く終わるような気がします。
 ご検討の程、よろしくお願いいたします。

[ ]
RE:39519 日付順にGREPした時に、ファイルNo.39520
秀丸担当 さん 22/01/20 15:36
 
V9.12βでgrepの日付順は追加したのですが、セミコロン区切りのワイルドカードご
とと、サブフォルダは別扱いになっています。
結果全体でソートするためには、結局のところ前に書いたマクロのほうがよかったで
す。
オプションでやるとしたら、書式をどうするのかとか、書記を自由にするとか、タグ
ジャンプとの互換性などを考えると、慎重にする必要がありあそうです。
それか、マクロとしてCOMなどの外部に頼らず標準で日付を取得する関数があると、
他にも用途がありそうでいいかもしれません。とりあえず標準の取得も検討しようと
思います。

[ ]
RE:39520 日付順にGREPした時に、ファイルNo.39521
styth さん 22/01/21 09:01
 
>それか、マクロとしてCOMなどの外部に頼らず標準で日付を取得する関数があると、
>他にも用途がありそうでいいかもしれません。とりあえず標準の取得も検討しよう
>と思います。
 よろしくお願いいたします。

[ ]
RE:39521 日付順にGREPした時に、ファイルNo.39523
でるもんたいいじま さん 22/01/21 12:44
 
でるもんた・いいじまです。

秀丸担当さん:
> それか、マクロとしてCOMなどの外部に頼らず
> 標準で日付を取得する関数があると、他にも
> 用途がありそうでいいかもしれません。
> とりあえず標準の取得も検討しようと思います。

stythさん:
> よろしくお願いいたします。

ついでにですが、「現在の日付・時刻を取得する手段」と「sleep文」も可能であれ
ばよろしくお願いします。

☆ ☆ ☆

とりあえず、日時のデータ形式は今のうちに検討しておいたほうがよさそうです。

32bit整数版の秀丸でも使えるように、ということならUNIX Time(1970.01.01 00:00
 GMTからの経過秒数)ですが、これは現時点で既に 0x40000000 を超えている。

NTFSの内部データは 1600.01.01 00:00 からの経過時間を100ms単位で記録していま
すが、それだと32bit版や、あるいは浮動小数点モードでは扱えない。

で、このどちらを使うにしても、「年月日時分秒」の形式に換算する方法が必要です。

☆ ☆ ☆

それと、現在時刻以外にも日時関係の機能が一通りあったら便利かなと思います。具
体的な仕様は上記の「ファイルのタイムスタンプを取得する方法」とも絡むので早急
に詰めないといけないのですが、一つの案を書いてみます。

@「日時の値」や「日時どうしの差分」は、秀丸の内部ではWin32APIのFILETIME型と
して扱い、マクロに対しては何らかの形でASCII文字列にエンコードして返す。sprin
tf() の "%016llX" 書式が簡便だと思います。(そのままsscanf() でデコードでき
ますし。)

A下記の関数を用意。

// 日時シリアル値を取得。
// ::GetSystemTimeAsFileTime() をそのまま返す。
$time = currentdatetime;

// 各パラメータから日時シリアル値を生成。
// 下記の案では、パラメータの並び順はWin32のSYSTEMTIME型と同じ。
// 受け取った値は、何らかの方法で正規化してから
// (たとえば標準Cのmktime()とlocaltime()を使う)
// ::SystemTimeToFileTime() に渡す。
$time = makegmtime(#year, #mon, #day, 0, #hour, #min, #sec, #msec);
$time = makelocaltime(#year, #mon, #day, 0, #hour, #min, #sec, #msec);

// 日時シリアル値を年月日・時分秒にバラす。
#status = getgmtime($time, #result[]);
#status = getlocaltime($time, #result[]);

// 日時シリアル値の計算。
// timediff($t1, $t2) は timeadd($t1. "-"+"$t2) で代用してもよさそう。
$time = timediff($t1, $t2);          // 引き算
$time = timeadd($t1, $t2[, $t3...])  // 足し算
$time = timemuldiv($t, #mult, #div); // 掛け算・割り算

// 日時シリアル値を指定の単位の(正負の)数値に変換。
// $unitには少なくとも "d","h","m","s","ms"が指定可能。
// 他に "us","ns","raw" もあると便利になりそうだし、
// "10ms"のような指定もできるようになると楽でいい。
#num = timeserial($time, $unit);

Bstrftime()は既存のPOSIXの仕様に合わせて実装しても使い勝手があまりよくない
ので、要望が出るまで後回しでいいかと。

☆ ☆ ☆

以上となります。こちらも一つの案としてご検討いただければ幸いです。

[ ]
RE:39523 日付順にGREPした時に、ファイルNo.39524
Iranoan さん 22/01/21 13:57
 
秀丸担当さん、でるもんた・いいじまさん今日は Iranoan です
> ついでにですが、「現在の日付・時刻を取得する手段」と「sleep文」も可能であ
>ればよろしくお願いします。
「現在の日付・時刻を取得する手段」に関しては date などが有りますが、何が不足
していると感じているのでしょう?

> とりあえず、日時のデータ形式は今のうちに検討しておいたほうがよさそうです。
でるもんた・いいじまさんの仰るように、32 bit の範囲で数値は難しいので文字列
で良い気がします
月や日付など全て固定桁数にしておけば、ソートは問題なくできます
具体的には
YYYY/MM/DD hh:mm:ss
形式や ISO 8601 の基本もしくは拡張形式の書式です

問題は日付・日時の計算が現状ではかなり煩雑なのですが、これに関しては
> 現在時刻以外にも日時関係の機能が一通りあったら便利かなと思います
に関係するのですが、tkinfo.dll から CurrentDate(), FormatDate(), ShiftDate()
 など一部の差分を取り出した DLL の同梱なら、開発側の負担も多くないと思うので
すが、どうでしょう?

あくまで思いつきの案に過ぎませんので、実際の作業量と乖離していれば申し訳あり
ません

[ ]
RE:39524 日付順にGREPした時に、ファイルNo.39526
秀丸担当 さん 22/01/21 15:42
 
日付の情報は数値だと32bitや64bitの問題があるので、文字列のほうがよさそうです。

書式を指定するとしたら、tkinfoの書式と同じように、YYYY-MM-DD hh:mm:ssといっ
た感じにできたらいいです。
秀丸パブリッシャーのBOXで日時を指定するときの書式や、秀丸ファイラーClassicの
名前の変更(連番/日時)や更新日時列の設定の書式でも同じような書式になっています。

以前からあるファイルの情報を取得する関数として、existfileを拡張して属性やフ
ァイルサイズが取得できる方法があります。
これにもう一つ拡張して更新日時等も得られたらいいとも思ったのですが、existfil
eでそういう情報が得られるとはわかりづらいので、素直にgetfiletimeとかのほうが
いいかもしれません。
そういう方向で検討しようと思います。

[ ]
RE:39524 日付順にGREPした時に、ファイルNo.39527
でるもんたいいじま さん 22/01/21 19:32
 
でるもんた・いいじまです。

> > ついでにですが、「現在の日付・時刻を取得する手段」と
> > 「sleep文」も可能であればよろしくお願いします。
> 「現在の日付・時刻を取得する手段」に関しては date などが
> 有りますが、何が不足していると感じているのでしょう?

失礼いたしました。完全に私の調査不足でした。
ヘルプをちゃんと検索してみたら、sleepも含めて全部、見つかりました。

#Windows標準のHTMLヘルプはもう20年以上使っているはずなのに、
#いつも「キーワード」タブばかり使っていて、「検索」タブを
#使ったことが今までほとんどありませんでした(笑)

というわけで、「本当に、マクロ言語の範囲内には存在しない」ものといえば、私が
今すぐ使うかどうかは別として、
@UTCでの(あるいは任意のタイムゾーンでの)日時取得
Aミリ秒あるいは以上の精度での時刻取得
B日時データの四則演算
くらいでしょうか。

「年月日」と「時分秒」の情報はきちんと1回のAPIコールで取得したものをバラして
いるようですし(APIの ::GetSystemTime() や ::GetSystemTimeAsFileTime() も
元々そういう設計)、MS-DOS時代のような煩わしいことも考えなくてよさそうです。

<与太話>
  MS-DOSのシステムコールでは、あるいは現在でもcmd.exeの
  date /t、time /t コマンドを使う場合はそうですが、
  「年月日」と「時分(秒)」とを別々に取得するので、先に
  年月日を取得して次に時刻を取得するだけの単純なコードだと、
  2回のコールの間に日付を跨いでしまう可能性があります。

  なのでそういう条件下では、こういうコードを書くことになります:
   @ます年月日を取得する。
   A次に時刻を取得する。
   B年月日を再度取得する。
   C2回取得した年月日が一致していれば、その日時で確定。
    もし一致していなければ、この間に日付を跨いだか、
    あるいは管理者やntpdなどがOSの時計を操作したと
    考えられるので、Aから再度やり直す。
   D上記ABを何回か繰り返して、それでもなお日付が
    一定しないようなら、何か想定外の事態なので処理を
    打ち切ってエラーとする。
</与太話>

> > とりあえず、日時のデータ形式は今のうちに検討しておいたほうがよさそうです。
> でるもんた・いいじまさんの仰るように、32 bit の範囲で数値は難しいので
> 文字列で良い気がします
> 月や日付など全て固定桁数にしておけば、ソートは問題なくできます

そうですね。さすがに年が5桁になることは考えなくていいでしょう。Windowsの内部
的には西暦30827年まで扱えるらしいですけど。

> 問題は日付・日時の計算が現状ではかなり煩雑なのですが、これに関しては
> > 現在時刻以外にも日時関係の機能が一通りあったら便利かなと思います
> に関係するのですが、tkinfo.dll から CurrentDate(), FormatDate(),
> ShiftDate() など一部の差分を取り出した DLL の同梱なら、
> 開発側の負担も多くないと思うのですが、どうでしょう?

あ、これも既にありましたか。それならサブセットと言わず、既存の tkinfo.dll を
そのまま同梱してしまったほうが楽になりそうです。

万一セキュリティホールが見つかってDLLの差替が必要になった場合も(多分そうい
うことはないとは思いますが…)、公式版の修正を待つにせよソースから野良ビルド
するにせよ作業量が最小で済みます。

ではでは。失礼いたしました。<(_ _;)>

[ ]
RE:39526 getfiletimeでエラー(no parametNo.39569
styth さん 22/02/22 09:07
 
>これにもう一つ拡張して更新日時等も得られたらいいとも思ったのですが、existfi
>leでそういう情報が得られるとはわかりづらいので、素直にgetfiletimeとかのほう
>がいいかもしれません。
 getfiletimeを追加して頂き、ありがとうございます。
 ところで、ヘルプには、
>第2パラメータを省略するか0の場合は、更新日時です。
 との記載があるのですが、省略すると、エラー(no parameter)になります。
 省略しないで、0を指定すると、大丈夫です。
 ご確認ください。
 使い方が間違っていたら、ご指摘ください。


$date = getfiletime( $file,  , "YY- M- D" );//×
$date = getfiletime( $file, 0, "YY- M- D" );//〇

[ ]
RE:39569 getfiletimeでエラー(no parametNo.39571
秀丸担当 さん 22/02/22 11:10
 
パラメータの省略は、他の文や関数でもそうなのですが、秀丸マクロの文法上、2番
目を飛ばして3番目だけ書くということはできないです。すみません。
1番目だけ書く場合、2番目以降は全部省略ということは可能です。
マクロヘルプでは「目次− パラメータの省略について 」のところに説明があります。

[ ]