フォルダの更新日時の設定
以前に作成した mtime を更新するツール.
データファイルなどの更新日時を揃えるために作成したもの.
更新日時の設定は CFile::SetStatus で行っている.
CString file = UpdateFiles[index] ;
CFileStatus fs ;
CFile::GetStatus(file,fs) ;
fs.m_mtime = newTime ;
CFile::SetStatus(file,fs) ;
このツールではフォルダの更新日時は変更できない.
その後 Linux 環境などでも動作する様なコードを作成.
utime を使用したもの.
Linux 環境ではフォルダに対してもうまく動作するが,Windows 環境では相変わらず.
ここまでは,以前調べたもの.
2ヶ月ほど前だったと思うが,検索していて次のページを見つけた.
ファイル・フォルダーの更新日時を変更
改めて CFile::SetStatus や _utime の中身を見ると,動作は同じで ::CreateFile と ::SetFileTime を呼出している.
デバッガで追いかけていると ::CreateFile で失敗している.errno は 13 .
::CreateFile を次の様に指定して呼出すと,ファイルの場合は問題ないがフォルダは NG .
HANDLE hFile = ::CreateFile(file_name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL) ;
フォルダの場合 FILE_FLAG_BACKUP_SEMANTICS が指定されていなければならないみたい.
HANDLE hFile = ::CreateFile(file_name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL) ;
time_t から FILETIME への変換は次の所.
https://learn.microsoft.com/ja-jp/windows/win32/sysinfo/converting-a-time-t-value-to-a-file-time
SetFTime.hxx
2024/08/09
https://itl.mish.work/i_Tools/Doc/blog/vc/UpdateMT.zip