touch

2011/05/29 更新

ダウンロード

touch について



           touch  Ver.0.04  Copyright (C) 2005-2011  K.Takata


1.概要
     ファイルやディレクトリのタイムスタンプを変更します。
     touch コマンドの亜種は数多ありますが、この touch は他のものとは異
    なり、ディレクトリのタイムスタンプを変更することができます。特に、
    WinNT 系だけではなく、Win9x でもディレクトリのタイムスタンプを変更で
    きる点が大きな特徴です。

     他のプログラムに、ディレクトリのタイムスタンプを変更できるようにす
    る機能を追加できるようにするための DLL (dirtime.dll) も同梱していま
    す。



2.動作環境
    ・touch.exe (Unicode 版)
        ・Windows2000/XP/Vista/7 など
        ・MSVCRT.DLL

    ・touch9x.exe (ANSI 版)
        適宜実行ファイル名を touch.exe にリネームしてお使いください。
        ・Windows98/2000/XP/Vista/7 など
        ・MSVCRT.DLL

    ・dirtime.dll
        ・Windows98/2000/XP/Vista/7 など

    (touch.exe 自身の動作には dirtime.dll は必要ありません。)



3.使用方法
     コマンドライン書式は以下のようになっています。

        > touch [<option>]... <file>...
         <option>
          -a           アーカイブファイルを処理 (未実装)
          -c           新規作成しない
          -A           アクセス日時を変更
          -C           作成日時を変更
          -M           変更日時を変更
          -R           再帰的にサブディレクトリを処理
          -d <string>  <string> を解釈してそれを日時として使用する
          -t <stamp>   [[CC]YY]MMDDhhmm[.ss[lll]] の形式で日時を指定
          -D <date>    [[CC]YY-]MM-DD の形式で日付を指定
          -T <time>    hh:mm[:ss[.lll]] の形式で時間を指定
          -r <rfile>   <rfile> のタイムスタンプを使用する
          -F           FAT タイムスタンプ
          -h,-H,-?     このヘルプを表示

     オプションは大文字小文字を区別するので注意してください。

     オプションを指定していないときは、指定ファイルが存在すれば、その変
    更日時を現在日時に変更します。指定ファイルが存在しなければサイズ 0
    のファイルを新規作成します。

     -A, -C オプションが指定されていない場合、-M が指定されたものとされ
    ます。-A または -C が指定された場合、-M を指定しないと変更日時は変更
    されません。

     -c, -t, -r オプションは GNU touch と互換です。

     -d オプションは GNU touch の下位互換です。現バージョンで解釈できる
    のは、"[[CC]YY-]MM-DD hh:mm[:ss[.lll]]" の形式のみです。

     -F オプションを指定すると、指定したファイルのタイムスタンプが、FAT
    ファイルシステム上のタイムスタンプの記録精度に合わせる形で丸められま
    す。具体的には、変更日時は 2秒、作成日時は 10ミリ秒単位で切り上げら
    れ、アクセス日時は 1日単位で切り捨てられます。
     例えば、FAT と NTFS の間でファイルをやりとりする時に、ファイルシス
    テムの違いによるタイムスタンプのずれが問題になるような場合に使用して
    ください。
     なお -F オプションを指定した場合には、-R 以外のオプションは全て無
    視されます。


    ・日時の書式に関して
        CC      年の上位2桁(省略すると 1969〜2068 として解釈)
        YY      年の下位2桁(省略すると現在の年)
        MM      月
        DD      日
        hh      時
        mm      分
        ss      秒(省略すると 00)
        lll     ミリ秒(省略すると 000)

      なお、FAT ファイルシステムでは、変更日時の記録精度は 2秒、作成日
     時の記録精度は 10ミリ秒、アクセス日時の記録精度は 1日となっています
     ので、それより細かい値を指定しても近い値に丸められますので注意して
     ください。また、1980-01-01 よりも前の日付を指定することはできません。



4.コンパイル
     コンパイラは VC++ 6.0 を利用しています。コマンドラインから
      > nmake -f touch.mak
     とするとコンパイルできます。



5.技術情報
     ディレクトリのタイムスタンプを変更するには特殊な処理が必要です。
    (特に Win9x) ここでは touch がそれをどのように行っているかを説明し
    ます。

     WinNT 系の場合は、CreateFile() で FILE_FLAG_BACKUP_SEMANTICS フラ
    グを指定することでディレクトリのハンドルを取得できますので、あとは通
    常のファイルと同じように、SetFileTime() を使えばタイムスタンプが変更
    できます。

     Win9x の場合は、通常の Win32 API を使ってディレクトリのタイムスタ
    ンプを変更することはできません。16bit アプリならば Int 21h Function
    7143h を実行することでディレクトリのタイムスタンプを変更することがで
    きるのですが、Win32 アプリはソフトウェア割り込みを発行することはでき
    ません。普通ならば、フラットサンクなどを使って、Win32 アプリから
    16bit DLL を呼び出し、その DLL で割り込みを発行するという方法を使う
    ところです。
     一方 touch では、Win9x の非公開 API を呼び出すことで、Win32 アプリ
    から直接 Int 21h Function 7143h を実行してタイムスタンプを変更してい
    ます。この API は、VxDCall() あるいは VxDCall0() と呼ばれるもので、
    この API を使うと、Win32 アプリから各種 VxD の特殊機能を呼び出すこと
    ができます。touch では VxDCall を使って VWin32.VxD の持つ、Int 21h
    を実行するという機能を呼び出しています。
     この方法の利点ですが、フラットサンクを使う場合には、実行ファイルと
    して、32bit EXE, 32bit DLL, 16bit DLL の少なくとも3つのファイルが必
    要となりますが、VxDCall を使うと 32bit EXE 1つだけでよいという点が
    挙げられます。プログラマ側の利点として、入手困難な 16bit コンパイラ
    が必要ないという点が挙げられます。

     VxDCall() の詳細に関しては、以下の参考文献に示した「Morry's
    Un'Gramming Page」に詳しく書かれていました。「Internet Archive」には、
    まだ内容が残っているようですので、そちらを参照してください。VxDCall()
    に関しては、「トップ」→「Playing with VWin32」→「VxDCall() API と
    Win32-Service の概要」と辿った先に書かれています。

     なお、FAT ファイルシステム上では、サブディレクトリ内の、"." と
    ".." の2つのエントリのタイムスタンプは変更されないようです。これら
    のタイムスタンプを変更したい場合には、ダイレクトディスクアクセスを使
    って、ディレクトリエントリを直接書き換えるといった方法が必要になりま
    す。



6.更新履歴
    2005/03/08  Ver.0.00
        ・最初の公開バージョン。

    2005/03/08  Ver.0.00a (非公開)
        ・dirtime.dll を追加。

    2005/03/10  Ver.0.01
        ・dirtime.dll を Unicode に対応させた。

    2005/05/09  Ver.0.02
        ・再帰処理時のエラー処理にミスがあったので修正。
        ・-F オプションを追加。

    2005/12/22  Ver.0.03
        ・エラーがあったときはそのファイル名を表示するように変更。
        ・作成日時とアクセス日時が逆になっていたのを修正。

    2011/05/29  Ver.0.04
        ・エラーがあった場合でも処理を継続するように変更。
        ・ファイルの属性を変更する権限があれば、ファイルの書き込み権限が
          無くてもタイムスタンプを変更できるように変更。
        ・Unicode 版の実行ファイルを用意。



7.参考文献など
    以下の touch コマンドを参考にしました。(オプション等)
      ・GNU touch
          http://linuxjm.sourceforge.jp/html/GNU_fileutils/man1/touch.1.
          html
      ・FreeBSD touch
          http://www.jp.freebsd.org/cgi/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-6.0.0%2Fman&man=touch
      ・水居 浄氏の TOUCH Version 1.11
          http://www.vector.co.jp/soft/dos/util/se004775.html
      ・小山 満氏の Touch Ver 1.26
          http://www.vector.co.jp/soft/win95/util/se029193.html


    以下の Web ページを参考にしました。
     ・Morry's Un'Gramming Page
          http://tech.millto.net/~morry/ (閉鎖)
          http://web.archive.org/http://tech.millto.net/~morry/



8.注意事項、その他
    ・このプログラムはフリーソフトウェアです。
    ・このプログラムの著作権は作者である私 K.Takata(高田 謙)に帰属しま
      す。
    ・もしこのプログラムを使用することで何らかの問題が発生しても作者はい
      っさいの責任を負いません。各自の責任で使用してください。
    ・アーカイブを変更しない限り配布/転載は自由です。
    ・ソースファイルの使用は非商用に限り自由です。ただし、このソースファ
      イルを利用したソフトを公開する際には、これを利用したことを明記して
      ください。

        作者   : K.Takata(高田 謙)
        URL    : http://webs.to/ken/
                 http://homepage3.nifty.com/k-takata/

戻る

Copyright (C) 2005-2011 K.Takata