2006年05月28日
川俣晶の縁側ソフトウェアその他開発日誌 total 3493 count

NT版UNIX-like toolsのcpでディレクトリのタイムスタンプがコピーされない問題

Written By: 川俣 晶連絡先

 NT版UNIX-like toolsのcpコマンドで、-rと-pオプションを使ってディレクトリ再帰コピーとタイムスタンプのコピーさせたとき、ディレクトリのタイムスタンプがコピーされませんでした。

 この問題は、Version 0.13で解消されました。

再現手順 §

 カレントディレクトリに、ディレクトリt1があり、t2が無いとき、以下のコマンドを実行します。

cp -rp t1 t2

 ディレクトリt1とt2のタイムスタンプ(作成と変更)は同じでなければならないのに、Version 0.12以前のものは食い違っていました。

原因と対策 §

 この問題は原因が2つあります。

 第1の原因は、Win32対応のコードを書き込んだときに、そのコードが誤っていたことです。ディレクトリを開く場合にFILE_FLAG_BACKUP_SEMANTICSを指定しなければならないのに、それが入っていませんでした。

 第2の原因は、NT系カーネルの場合、ディレクトリ内のファイルを書き換えるとディレクトリの変更日付時刻も変わるという仕様のため、たとえ正しい日付時刻の設定に成功してもそれが書き換わってしまうことでした。これは、ディレクトリの日付時刻を設定するタイミングをディレクトリ内の全ファイルのコピー終了後に移動させることで対処しました。