1

Тема: AHK: FileSetTime

Добрый день!
Обнаружил некорректную работу функции FileSetTime в своем коде:
Код сократил, но суть осталась:


InputBox, YYYY, год, , 640, 480
InputBox, MM, месяц, , 640, 480
InputBox, DD, день, , 640, 480
InputBox, HH24, час, , 640, 480
InputBox, MI, минуты, , 640, 480
InputBox, SS, секунды, , 640, 480
timetoset := YYYY . MM . DD . HH24 . MI . SS
FileSetTime, timetoset, C:\Users\sda\Desktop\Новая папка\Новый текстовый документ.txt, C
FileSetTime, timetoset, C:\Users\sda\Desktop\Новая папка\Новый текстовый документ.txt, M
FileSetTime, timetoset, C:\Users\sda\Desktop\Новая папка\Новый текстовый документ.txt, A
MsgBox % timetoset
return

В MsgBox выдает нормальный штамп, а в файле именно час ставит на 1 больше.
Кто-нибудь сталкивался? Проверял на дате 11.11.2011 11:11. Время файла ставит 12:11.

2 (изменено: teadrinker, 2019-05-31 08:30:42)

Re: AHK: FileSetTime

А инпутбоксы-то зачем? Сразу нельзя дату в код записать?
Выяснил, что это к AHK не имеет отношения, так система ставит:

VarSetCapacity(SYSTEMTIME, 16, 0)
NumPut(2011, SYSTEMTIME)      ; year
NumPut(11, SYSTEMTIME, 2)     ; month
NumPut(11, SYSTEMTIME, 6)     ; day
NumPut(11 - 3, SYSTEMTIME, 8) ; hour UTC

VarSetCapacity(FILETIME, 8, 0)
DllCall("SystemTimeToFileTime", Ptr, &SYSTEMTIME, Ptr, &FILETIME)

filePath := A_Desktop . "\Новый текстовый документ.txt"
FileDelete, % filePath
FILE_WRITE_ATTRIBUTES := 0x100, OPEN_ALWAYS := 4
hFile := DllCall("CreateFile", Str, filePath, UInt, FILE_WRITE_ATTRIBUTES, UInt, 0, Ptr, 0, UInt, OPEN_ALWAYS, UInt, 0, Ptr, 0, Ptr) 
DllCall("SetFileTime", Ptr, hFile, Ptr, &FILETIME, Ptr, &FILETIME, Ptr, &FILETIME)
DllCall("CloseHandle", Ptr, hFile)

Возможно, как-то связано с этим.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: FileSetTime

teadrinker пишет:

А инпутбоксы-то зачем? Сразу нельзя дату в код записать?

Увы, нет. Файл будет скомпилирован. Самому не нравится, а с GUI толком не умею работать, чтобы за одно диалоговое окно все вбить.

teadrinker пишет:

Выяснил, что это к AHK не имеет отношения, так система ставит:

Но MsgBox в конце кода все воспринимает правильно. Поэтому у меня было сомнение в отношении именно функции FileSetTime.

teadrinker пишет:

Возможно, как-то связано с этим.

На компе это отключено. Вроде не должно влиять.

Решил вопрос пока "шляпокодом", т.к. обычно файлы создаются в рабочее время.


InputBox, HH24, час, , 640, 480
HH24 := HH24 - 1

В любом случае, teadrinker,  спасибо за ответ!

4

Re: AHK: FileSetTime

dmitry-semin пишет:

Увы, нет. Файл будет скомпилирован.

Я имел в виду, что для демонстрации проблемы инпутбоксы не нужны, достаточно было записать код строкой.

dmitry-semin пишет:

Решил вопрос пока "шляпокодом"

Так у вас в любом случае на час больше получается, независимо от даты?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5

Re: AHK: FileSetTime

teadrinker
Дошло наконец. Спасибо!
Чтобы работало корректно должно выглядеть так:


if (YYYY <= 2014)
	if (MM <= 10)
		if (HH24 <= 14)
			{
			HH24 := HH24 - 1
			}
timetoset := YYYY . MM . DD . HH24 . MI . SS
FileSetTime, timetoset, F:\скрипты\LOGmap.txt, C
FileSetTime, timetoset, F:\скрипты\LOGmap.txt, M
FileSetTime, timetoset, F:\скрипты\LOGmap.txt, A

6

Re: AHK: FileSetTime

Не думаю.

filePath := A_Desktop . "\test.txt"
YYYY := 2013
MM := "09"
DD := 11
HH24 := 13
if (YYYY <= 2014)
   if (MM <= 10)
      if (HH24 <= 14)
         {
         HH24 := HH24 - 1
         }
MsgBox, % timetoset := YYYY . MM . DD . HH24 . MI . SS
FileSetTime, timetoset, % filePath, C
FileSetTime, timetoset, % filePath, M
FileSetTime, timetoset, % filePath, A 
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: AHK: FileSetTime

Насколько я понял, проблема касается только ноября 2011 года. Так что можно просто не обращать внимания.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

8

Re: AHK: FileSetTime

Из-за часового пояса. Дата ставиться согласно UTC/GMT(+0), у вас часовой пояс может быть +1,+2,...

9 (изменено: teadrinker, 2019-05-31 21:32:02)

Re: AHK: FileSetTime

MandarinKa02, в смысле, в ноябре 2011 часовой пояс на месяц сменился, а потом опять вернулся обратно? И разве не у вас не то время ставится командой FileSetTime, которое вы указываете?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

10

Re: AHK: FileSetTime

Дело не в 2011 году и не часовом поясе.
https://www.autoitscript.com/forum/topi … windows-7/

11

Re: AHK: FileSetTime

Я так и предполагал, что есть связь с переходом на зимнее/летнее время. Непонятно только, почему эта ошибка не во все года проявляется.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

12

Re: AHK: FileSetTime

Не знаю. У меня с рижским временем во все.
На оф.форуме решения вроде как написали:
https://www.autohotkey.com/boards/viewt … 48#p274645
https://www.autohotkey.com/boards/viewt … 20#p253083

13

Re: AHK: FileSetTime

Да, так корректно выставляет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

14

Re: AHK: FileSetTime

teadrinker пишет:

в смысле, в ноябре 2011 часовой пояс на месяц сменился, а потом опять вернулся обратно? И разве не у вас не то время ставится командой FileSetTime, которое вы указываете?

Я не об этом. Однажды, я задал время создания/изменения файла через FileSetTime, скинул этот файл другому человеку и заметил, что время не совпадает, а именно - ушло на час назад. Спустя несколько минут размышлений проверил часовой пояс на удаленном компьютере и заметил, что там часовой пояс, соответственно, на 1 час меньше(или больше) чем у меня.

15

Re: AHK: FileSetTime

P.S. можете сейчас проверить. Устанавливаем время файлу, и после меняем часовой пояс.

FileSetTime,  20050505042000,% A_Desktop "\1.exe",M
FileSetTime,  20050505042000,% A_Desktop "\1.exe",C
FileSetTime,  20050505042000,% A_Desktop "\1.exe",A

16

Re: AHK: FileSetTime

Так время же неправильно отображается не у пользователя с другим часовым поясом, а на одном и том же компьютере, где часовой пояс не меняли после установки.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

17 (изменено: dmitry-semin, 2019-06-05 06:37:31)

Re: AHK: FileSetTime

teadrinker пишет:

Не думаю.

Да в этом коде была ошибка


if (YYYY <= 2014)
   if (MM <= 10)
		if (DD  <= 26)
         {
         HH24 := HH24 - 1
         }

Условием должен быть день, а не час.

у меня переломной датой  (когда скрипт начинает работать нормально) на компе является 14.10.2014, что внезапно совпадает с ред. от 21.07.2014 ФЗ от 03.06.2011 N 107-ФЗ "Об исчислении времени", которая начинает действовать с 26.10.2014 (в 2 часа 00 минут).

К сожалению я юрист, а не программист, поэтому из указанноно ниже кода не смог понять практически ничего:(

увы раздел external libraries в документации для меня пока темный лес.
Хотелось решить вопрос штатными командами.

18

Re: AHK: FileSetTime

dmitry-semin пишет:

Хотелось решить вопрос штатными командами.

Не получится.

FilePath := "test.txt"
timetoset := 20180615151525
SetFileTime(FilePath, timetoset, "M")
SetFileTime(FilePath, timetoset, "C")
SetFileTime(FilePath, timetoset, "A")
return

; ======================================================================================================================
; SetFileTime
;     -> docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-setfiletime
; TzSpecificLocalTimeToSystemTime
;     -> docs.microsoft.com/en-us/windows/desktop/api/timezoneapi/nf-timezoneapi-tzspecificlocaltimetosystemtime
; SystemTimeToFileTime
;     -> docs.microsoft.com/en-us/windows/desktop/api/timezoneapi/nf-timezoneapi-systemtimetofiletime
; CreateFile
;     -> docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea
;     FILE_WRITE_ATTRIBUTES 0x0100
;     FILE_SHARE_READ       0x01 +
;     FILE_SHARE_WRITE      0x02 +- 0X07
;     FILE_SHARE_DELETE     0x04 +
;     OPEN_EXISTING         3
;     FILE_ATTRIBUTE_NORMAL 0x80
; ======================================================================================================================
SetFileTime(FilePath, TimeStamp, Type := "M") {
   If !TimeStamp2SystemTime(TimeStamp, LocalTime)
      Return False
   If !(Handle := DllCall("CreateFile", "Str", FilePath, "UInt", 0x0100, "UInt", 0x07, "Ptr", 0
                                      , "UInt", 3, "UInt", 0x80, "Ptr", 0, "UPtr"))
      Return False
   ; Aktuelle Daten einlesen
   VarSetCapacity(CTime, 16, 0)
   VarSetCapacity(ATime, 16, 0)
   VarSetCapacity(MTime, 16, 0)
   If !DllCall("GetFileTime", "Ptr", Handle, "Ptr", &CTime, "Ptr", &ATime, "Ptr", &MTime, "UInt") {
      DllCall("CloseHandle", "Ptr", Handle, "UInt")
      Return False
   }
   ; Geändertes Datum schreiben
   VarSetCapacity(SystemTime, 16, 0)
   DllCall("TzSpecificLocalTimeToSystemTime", "Ptr", 0, "Ptr", &LocalTime, "Ptr", &SystemTime, "UInt")
   VarSetCapacity(FileTime, 8, 0)
   DllCall("SystemTimeToFileTime", "Ptr", &SystemTime, "Ptr", &FileTime, "UInt")
   PCT := Type = "C" ? &FileTime : &CTime
   PAT := Type = "A" ? &FileTime : &ATime
   PMT := Type = "M" ? &FileTime : &MTime
   Result := DllCall("SetFileTime", "Ptr", Handle, "Ptr", PCT, "Ptr", PAT, "Ptr", PMT, "UInt")
   DllCall("CloseHandle", "Ptr", Handle, "UInt")
   Return Result
}
; ======================================================================================================================
; TimeStamp = YYYYMMDDHH24MISS (autohotkey.com/docs/commands/FileSetTime.htm#YYYYMMDD)
; SystemTime -> msdn.microsoft.com/en-us/f77cdf86-0f97-4a89-b565-95b46fa7d65b
; ======================================================================================================================
TimeStamp2SystemTime(TimeStamp, ByRef SystemTime) {
   VarSetCapacity(SystemTime, 16, 0)
   TimeStamp += 0, S
   If (TimeStamp = "")
      Return False
   NumPut(SubStr(TimeStamp,  1, 4), SystemTime,  0, "UShort")
   NumPut(SubStr(TimeStamp,  5, 2), SystemTime,  2, "UShort")
   NumPut(SubStr(TimeStamp,  7, 2), SystemTime,  6, "UShort")
   NumPut(SubStr(TimeStamp,  9, 2), SystemTime,  8, "UShort")
   NumPut(SubStr(TimeStamp, 11, 2), SystemTime, 10, "UShort")
   NumPut(SubStr(TimeStamp, 13, 2), SystemTime, 12, "UShort")
   Return True
}