1

Тема: AHK:Срабатывание звукового сигнала если размер директории не изменился

В первый раз сигнал срабатывает, а после какого-либо изменения в директории уже нет.
Что тут не так?
Спасибо!

#Persistent
FolderPath := "E:\TEST"
  FolderSize = 0
  Loop, %FolderPath%\*.*, , 1
  FolderSize += %A_LoopFileSize%
DoThis:
   Folder2Size = 0
   Loop, %FolderPath%\*.*, , 1
   Folder2Size += %A_LoopFileSize%
   MsgBox, %Folder2Size%
if (Folder2Size == FolderSize)
   {
      SoundBeep, 750, 500
      FolderSize = 0
      Loop, %FolderPath%\*.*, , 1
      FolderSize += %A_LoopFileSize%
      MsgBox, %FolderSize%

   }
      SetTimer , DoThis, 2000
return

2 (изменено: Александр_, 2011-11-29 23:38:49)

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Malcev пишет:

В первый раз сигнал срабатывает, а после какого-либо изменения в директории уже нет.
Что тут не так?

Лучше не дёргать систему таймерами и перебором файлов, а воспользоваться соответствующими функциями системы, примеры тут.
Что касается этого кода:

if (Folder2Size == FolderSize)
{
   ...
}
else
{
   FolderSize := Folder2Size
}

3

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

По-моему, достаточно сопоставить заголовок темы и вопрос! Вообще, код довольно бредовый. Знак "==" здесь не нужен, из-за него может быть ошибка. Всё время перезапускать таймер тоже ни к чему.

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

4

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

teadrinker пишет:

Знак "==" здесь не нужен, из-за него может быть ошибка.

Для числовых значений не важно "=" или "==".

teadrinker пишет:

Всё время перезапускать таймер тоже ни к чему.

Кстати да, я на это внимания не обратил- нужно было либо один раз таймер поставить, либо sleep+goto. Хотя я вообще против меток и за функции .

5

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Александр_ пишет:

Для числовых значений не важно "=" или "==".

Сейчас проверил, действительно.

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

6 (изменено: Malcev, 2011-11-30 10:46:18)

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Александр_, твой код наверное не подойдёт, потому что это всё мне надо для проверки не прекратилась ли запись.
Я с камеры практически безостановочно (с перерывом на 5 секунд в час) одним файлом записываю видео в директорию.
Поэтому мне и надо чтоб компьютер пибикал, во время этого перерыва либо при каких-либо ошибках.
Что-то действительно я не подумал о присвоении значения FolderSize := Folder2Size
Тогда код должен быть таким?

#Persistent
FolderPath := "E:\TEST"
  FolderSize = 0
  Loop, %FolderPath%\*.*, , 1
  FolderSize += %A_LoopFileSize%
DoThis:
   Folder2Size = 0
   Loop, %FolderPath%\*.*, , 1
   Folder2Size += %A_LoopFileSize%
if (Folder2Size = FolderSize)
   {
      SoundBeep, 750, 500
       }
else
{
   FolderSize := Folder2Size
}
sleep, 2000
Goto, DoThis
return

А чем Goto лучше чем SetTimer?
В хэлпе написано - "The use of Goto is discouraged because it generally makes scripts less readable and harder to maintain. Consider using Else, Blocks, Break, and Continue as substitutes for Goto. "

7

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Malcev пишет:

Александр_, твой код наверное не подойдёт, потому что это всё мне надо для проверки не прекратилась ли запись.
Я с камеры практически безостановочно (с перерывом на 5 секунд в час) одним файлом записываю видео в директорию.

Тогда почему тут вся папка мониторится? Самое медленно место в программе- это обращения к винчестеру, поэтому их нужно сводить к минимуму.

Malcev пишет:

А чем Goto лучше чем SetTimer?
В хэлпе написано - "The use of Goto is discouraged because it generally makes scripts less readable and harder to maintain. Consider using Else, Blocks, Break, and Continue as substitutes for Goto. "

Угу, но таймер надо ставить один раз, а в конце удалять. Если следовать этой рекомендации, то лучше всего, наверно так:

loop
{
   ...
   sleep 2000
}

8 (изменено: Malcev, 2011-11-30 15:40:44)

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Тогда почему тут вся папка мониторится?

Каждый час создаётся новый файл.
То есть мониторить надо последний файл из созданных.
Что-то не могу продумать алгоритм.
Это получается, что мы вначале находим последний созданный файл, потом в цикле его сравниваем размер, если размер одинаковый то пибикаем и возвращаемся к поиску последнему созданному файлу так?

9

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Malcev пишет:
Тогда почему тут вся папка мониторится?

Каждый час создаётся новый файл.
То есть мониторить надо последний файл из созданных.
Что-то не могу продумать алгоритм.
Это получается, что мы вначале находим последний созданный файл, потом в цикле его сравниваем размер, если размер одинаковый то пибикаем и возвращаемся к поиску последнему созданному файлу так?

Лучше ничего не искать, а получать уведомления об изменениях в этой папке, указав тип изменений FILE_NOTIFY_CHANGE_SIZE(изменился размер) или FILE_NOTIFY_CHANGE_LAST_WRITE(изменилась дата последней записи). Далее два варианта:
"точный"- при получении уведомления ставим(изменяем, если он уже поставлен) таймер.
"безтаймерный"- сохраняем время получения уведомления в переменную и в цикле со sleep'ом сравниваем его с текущим временем.

10 (изменено: Malcev, 2011-11-30 19:17:13)

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Во время записи в директорию, размер директории не изменяется, хоть сутки пиши.
Размер же файла в эксплорере определяется нулевым и только если нажимать на его свойства - видно, что размер изменяется.
Поэтому твой скрипт, показывает изменения в директории, только после остановки записи, так как после остановки записи и "создаётся" этот файл
А мне нужно чтобы скрипт проверял этот файл во время записи.
Вот в чём загвоздка

11

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Вроде такой вариант проходит

#Persistent
FolderSize = 0
DriveSpaceFree, FreeSpace, e:\
FolderSize += %FreeSpace%
loop
{
   Folder2Size = 0
   DriveSpaceFree, FreeSpace, e:\
   Folder2Size += %FreeSpace%
if (Folder2Size = FolderSize)
   {
      SoundBeep, 750, 500
       }
else
{
   FolderSize := Folder2Size
}
sleep, 2000
}
return

12 (изменено: Александр_, 2011-11-30 23:42:51)

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Malcev пишет:

Вроде такой вариант проходит

Только если на винчере больше никто ничего не делает.

Malcev пишет:

Во время записи в директорию, размер директории не изменяется, хоть сутки пиши.
Размер же файла в эксплорере определяется нулевым и только если нажимать на его свойства - видно, что размер изменяется.
Поэтому твой скрипт, показывает изменения в директории, только после остановки записи, так как после остановки записи и "создаётся" этот файл
А мне нужно чтобы скрипт проверял этот файл во время записи.
Вот в чём загвоздка

Ясно, значит программа пишет не закрывая хендл и это печально(для нас, не для программы). Тогда, если новый файл создаётся редко(раз в час, например ), то алгоритм такой:

Path := A_ScriptDir
FileName := GetLastModifiedFileName(Path)
hFile := CreateFile(FileName, 0, 7, 0, 3, 0x80, 0)
FileSize := MyGetFileSize(hFile)
NewFileSize := FileSize
NewFileName := ""
loop
{
   Sleep 2000
   NewFileSize:=MyGetFileSize(hFile)
   if (NewFileSize = FileSize)
   {
      NewFileName := GetLastModifiedFileName(Path)
	  if(NewFileName=FileName)
	  {
	     SoundBeep 750, 500
	  }
	  else
	  {
         FileName := NewFileName
		 CloseHandle(hFile)
		 hFile := CreateFile(FileName, 0, 7, 0, 3, 0x80, 0)
		 FileSize := MyGetFileSize(hFile)
         NewFileSize := FileSize
	  }
   }
   else
   {
      FileSize := NewFileSize
   }
}
return

CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
{
   return DllCall("CreateFile", "str", lpFileName, "uint", dwDesiredAccess, "uint", dwShareMode, "uint", lpSecurityAttributes, "uint", dwCreationDisposition, "uint", dwFlagsAndAttributes, "uint", hTemplateFile, "uint")
}

CloseHandle(Handle)
{
   return DllCall("CloseHandle", "uint", Handle)
}

GetFileInformationByHandle(hFile, lpFileInformation)
{
   return DllCall("GetFileInformationByHandle", "uint", hFile, "uint", lpFileInformation, "uint")
}

MyGetFileSize(hFile)
{
   VarSetCapacity(FileInformation, 52)
   GetFileInformationByHandle(hFile, &FileInformation)
   ret := NumGet(&FileInformation, 36)
   VarSetCapacity(FileInformation, 0)
   return ret
}

GetLastModifiedFileName(Path)
{
   FileTimeModified := 0
   FileName := ""
   Loop %Path%\*.*, , 1
   {
      if(A_LoopFileTimeModified>FileTimeModified)
      {
         FileTimeModified := A_LoopFileTimeModified
		 FileName := A_LoopFileLongPath
      }
   }
   return FileName
}

Esc::ExitApp

13

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Не подходит этот скрипт.
Я прописал в него

   FileGetSize NewFileSize, %FileName% ; получаем новый размер
msgbox, %FileSize%
msgbox, %NewFileSize%
   if (NewFileSize = FileSize) ; если они равны

И во время записи он выдаёт, что у первого, что у второго нули.

14

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Malcev пишет:

Не подходит этот скрипт.
Я прописал в него

   FileGetSize NewFileSize, %FileName% ; получаем новый размер
msgbox, %FileSize%
msgbox, %NewFileSize%
   if (NewFileSize = FileSize) ; если они равны

И во время записи он выдаёт, что у первого, что у второго нули.

только на этих файлах или на любых?

15 (изменено: Malcev, 2011-11-30 22:03:46)

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

На файл, который создаётся во время записи видео в папке для мониторинга.
Он создаётся с нулевым размером, таким и остаётся до нажатия стоп.
Его реальный размер можно узнать только нажав на его Properties.
Конечно же после окончания записи, msgbox показывает реальный размер этого файла

16

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Malcev пишет:

На файл, который создаётся во время записи видео в папке для мониторинга.
Он создаётся с нулевым размером, таким и остаётся до нажатия стоп.
Его реальный размер можно узнать только нажав на его Properties.
Конечно же после окончания записи, msgbox показывает реальный размер этого файла

А так?(исправил код в посте 12)

17

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

То же самое.

18

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

Malcev пишет:

То же самое.

Да бл... А теперь?

19

Re: AHK:Срабатывание звукового сигнала если размер директории не изменился

А вот так работает.
Сегодня проверю в поле.
Спасибо!