This might work - sorry, I have not had time to test it -
unfortunately, yard work is calling :(
dll "<kernel32.dll>"
integer proc GetLastError() : "GetLastError"
integer proc GetDiskFreeSpace(string root_dir:cstrval,
var integer SectorsPerCluster,
var integer BytesPerSector,
var integer NumberOfFreeClusters,
var integer TotalNumberOfClusters) : "GetDiskFreeSpaceA"
integer proc GetDiskFreeSpaceEx(
string lpDirectoryName:cstrval,
var integer lpFreeBytesAvailableToCaller,
var integer lpTotalNumberOfBytes,
var integer lpTotalNumberOfFreeBytes) : "GetDiskFreeSpaceExA"
integer proc LoadLibrary(string libraryname:cstrval) :"LoadLibraryA"
integer proc FreeLibrary(integer dllhandle) :"FreeLibrary"
integer proc GetProcAddress(integer dllhandle, string
procname:cstrval) :"GetProcAddress"
integer proc CreateFile(string fn:cstrval, integer mode, integer
sec, integer attr, integer flags, integer junk1, integer junk2) :
"CreateFileA"
integer proc CloseHandle(integer handle) : "CloseHandle"
integer proc DosDateTimeToFileTime(integer date:word, integer
time:word, string FILETIME:StrPtr) : "DosDateTimeToFileTime"
integer proc LocalFileTimeToFileTime(string in_time:StrPtr, string
out_time:StrPtr) : "LocalFileTimeToFileTime"
integer proc SetFileTime(integer handle,
// string FILETIME_Creation:StrPtr,
integer FILETIME_Creation,
// string FILETIME_LastAccess:StrPtr,
integer FILETIME_LastAccess,
string FILETIME_LastWrite:StrPtr) : "SetFileTime"
integer proc FileTimeToSystemTime(string ft:StrPtr, string
utcSt:StrPtr) : "FileTimeToSystemTime"
integer proc SetFileDateTimeFromDos(string filePath:cstrval,
integer dosDate:word, integer dosTime:word) : "SetFileDateTimeFromDos"
integer proc SystemTimeToFileTime(string utcSt_DST:StrPtr, string
ft_DST:StrPtr) : "SystemTimeToFileTime"
integer proc SystemTimeToTzSpecificLocalTime(integer x, string
utcSt:StrPtr, string st:StrPtr) : "SystemTimeToTzSpecificLocalTime"
integer proc TzSpecificLocalTimeToSystemTime(integer x, string
st:StrPtr, string utcSt_DST:StrPtr) :
"TzSpecificLocalTimeToSystemTime"
end
/*
DosDateTimeToFileTime(dosDate, dosTime, &ft)
FileTimeToSystemTime(&ft, &utcSt))
SetFileDateTimeFromDos(filePath, dosDate, dosTime)
SystemTimeToFileTime(&utcSt_DST, &ft_DST)
SystemTimeToTzSpecificLocalTime(NULL, &utcSt, &st)
TzSpecificLocalTimeToSystemTime(NULL, &st, &utcSt_DST)
*/
#define FILE_FLAG_BACKUP_SEMANTICS 33554432
#define OPEN_EXISTING 3
#define GENERIC_WRITE 0x40000000
integer proc LoSetDateTime(string fn, integer month, integer day, integer year,
integer hours, integer mins, integer secs)
integer handle, Dostime, Dosdate, ok
// these might only need to be 8 chars each
string ft[16] = " ", utcSt[16] = " ",
st[16] = " ", utcSt_DST[16] = " ",
ft_DST[16] = " "
Dostime = (hours shl 11) | (mins shl 5) | (secs / 2)
// Bitfields for file time:
// 15-11 hours (0-23)
// 10-5 minutes
// 4-0 seconds/2
Dosdate = ((year - 1980) shl 9) | (month shl 5) | day
// Bitfields for file date:
// 15-9 year - 1980
// 8-5 month
// 4-0 day
// 1. Convert DOS date and time to FILETIME.
if not DosDateTimeToFileTime(Dosdate, Dostime, ft)
return (warn("Error on DosDateTimeToFileTime()"))
endif
// 2. Convert the FILETIME to SYSTEMTIME (UTC)
if not FileTimeToSystemTime(ft, utcSt)
return (warn("Error on FileTimeToSystemTime()"))
endif
// 3. Convert the UTC time to local time
if not SystemTimeToTzSpecificLocalTime(0, utcSt, st)
return (warn("Error on SystemTimeToTzSpecificLocalTime()"))
endif
// 4. Convert Local Time to UTC with DST
if not TzSpecificLocalTimeToSystemTime(0, st, utcSt_DST)
return (warn("Error on TzSpecificLocalTimeToSystemTime()"))
endif
// 5. Convert the UTC time to a FILETIME.
if not SystemTimeToFileTime(utcSt_DST, ft_DST)
return (warn("Error on SystemTimeToFileTime()"))
endif
// 6. Open the file with write attributes access.
// the two 0's are FILETIME_Creation and FILETIME_LastAccess, but to pass
// 0 they have to have been declared as integers.
handle = CreateFile(fn,
GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
0
) // GENERIC_WRITE and OPEN_EXISTING
if handle == -1
return (Warn("Error ", GetLastError(), " opening file ", fn))
endif
// 7. Set the last modified time of the file.
ok = SetFileTime(handle, 0, 0, ft_DST)
if not ok
Warn("Error ", GetLastError(), " setting time, handle:", handle)
endif
// 8. Close the file handle.
CloseHandle(handle)
return (ok)
end