プロが教える店舗&オフィスのセキュリティ対策術

VisualC++のCreateFile関数を用いて「作成日時が1週間前であれば
ファイルをリネームして保存後、以前のファイル名で
空ファイルを作成する」という処理を作っています。

(作成中の関数の抜粋)
/* リネーム処理 */
ret_code = MoveFile(logfile_path, rename_path);
if(ret_code == API_NG){ return(NG); }

/* 以前と同じ名前でファイルを新規作成 */
hfile = CreateFile(logfile_path,
GENERIC_WRITE,FILE_SHARE_WRITE,
NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
FILE_FLAG_NO_BUFFERING);
if( hfile == INVALID_HANDLE_VALUE ) { return(NG); }
CloseHandle(hfile);
}

return(OK);
}
リネームする以前と同じ名前でファイルを作成すると
ファイルの作成日時がリネームする以前の作成日時になってしまいます。
(例)
4月1日に「aaa.txt」を作成→
4月8日に「aaa_0401.txt」にリネーム後、新規に「aaa.txt」を作成すると
作成日時が「4月1日」になってしまう。

Microsoftのページによると、キャッシュファイルの情報を取得しているために
以前の作成日時にてファイルが作成されてしまうようです。
http://www.microsoft.com/JAPAN/developer/library …

原因は分かったのですが、対処方法が思い浮かびません。
上記問題を解決するにはどういった方法がありますでしょうか?
ご教授をよろしくお願いします。

A 回答 (3件)

新しく作成したファイルに、SetFileTime APIで現在の日時を設定してはどうですか?



GetSystemTime APIでシステム時間を取得して、SystemTimeToFileTime APIでファイル時刻へ変換しSetFileTime APIでファイルの時刻を変更すれば更新できそうですが、試していないので結果はわかりません。

http://msdn.microsoft.com/library/ja/jpsysinf/ht …
http://msdn.microsoft.com/library/ja/jpsysinf/ht …
http://msdn.microsoft.com/library/ja/jpsysinf/ht …
    • good
    • 0
この回答へのお礼

ご指摘の通り、下記APIにて作成日時を更新することができました。

SystemTimeToFileTime→
LocalFileTimeToFileTime→
SetFileTime

言われてみれば「なるほど~」という対処方法で
なかなか気づきませんでした(汗)
どうもありがとうございましたm(_ _)m

お礼日時:2006/03/29 16:05

いったん該当ファイルを削除して、それからもう一度作成したらよいと思いますよ。


DeleteFile()とか...
    • good
    • 0
この回答へのお礼

MoveFile関数を、CopyFile&DeleteFile関数に変更しましたが、結果は同じでした。
(対処方法を勘違いしていましたらすみません)
やはりキャッシュが悪さをしてるのでしょうかねぇ。

お礼日時:2006/03/28 15:58

新規にaaa.txtを作成せずに別の名前でファイルを作成した後、aaa.txtにリネームする。

    • good
    • 0
この回答へのお礼

(引数は省略)
(1)CopyFile(aaa.txt, aaa_0408.txt)

(2)CreateFile(tmp.txt)

(3)MoveFile(tmp.txt, aaa.txt)

とすると、(3)にて作成日時が元に戻ってしまいました・・・
どうやらこちらの方法ではうまくいかないようです。

お礼日時:2006/03/28 16:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!