Что нового

Мониторинг папки на появление новых файлов, с частотой 1 раз в 5 минут, перенос файлов в назначенное место

lexnett75

Новичок
Сообщения
4
Репутация
0
Необходим мониторинг папки на появление новых файлов, с частотой 1 раз в 5 минут, найденные файлы перенести в назначенное место, затем снова перейти в режим мониторинга. Если указанная папка недоступна ждать 5 минут затем снова попытка мониторинга.
зациклить до отмены скрипта оператором
 
Последнее редактирование:
Автор
L

lexnett75

Новичок
Сообщения
4
Репутация
0
Что делать с файлами, с именами которых в назначенном месте к этому моменту есть файлы?
Обнаруженные файлы- вырезаются и переносятся в назначенную папку.
Если из папки (которую мониторим) забираем файлы, а они при перемещении в назначенную папку ВДРУГ имеют одинаковое имя (с теми файлами которые уже забрали и которые уже лежат в назначенной для копирования папке - то добавляем к имени нового файла числовой префикс.

В папке, которую мониторим - всегда появляются только файлы с расширениями: *.jpg и *.htm которым сторонняя утилита УЖЕ ПРИСВОИЛА рандомные имена.

Пример:
Скрипт мониторит нужную папку например: \\win01\user01\dat, с частотой 1 раз в 5 минут...
в папке \dat, которую скрипт мониторит, появились файлы qwe_*.jpg, rty_*.jpg, uio_*.jpg, zxc_*.htm, vbn_*.htm
Скрипт "забирает" ВСЕ файлы, что имеются на данную секунду в папке \dat. - вырезает их из исходной папки (именно вырезает, а не копирует) и переносит в нужную директорию (например в D:\find)
Если в D:\find уже есть файл с таким именем (например случайно так совпало, и уже есть файл с одинаковым именем) например переносим zxc_*.htm, а в D:\find уже есть такой файл, то к имени нового файла добавляется префикс "01", и файл получается с новым именем: zxc_01*.htm - этот файл и сохраняется D:\find, в которой теперь будут лежать zxc_*.htm, и zxc_01*.htm

После того, как все перенесено - скрипт переходит в режим ожидания - тайм 5 минут и все повторяется заново.
Если \dat недоступна, ждать 5 минут затем снова провести попытку мониторинга.
Скрипт зациклить

Системе, в которой запущен скрипт - не разрешать "засыпать"
В папке D:\find файлы копятся. Файлы проверяет и если надо очищает - человек оператор в ручную.
 
Последнее редактирование:

lettterssino

Знающий
Сообщения
109
Репутация
10
НУ самое простое, это поиск файлов через
Код:
_FO_FileSearch()

Если уже есть, сравнить их по хэшу и перенести через
Код:
FileMove()

ну и слип поставь, которые тебе нужен в цикле.
 
Последнее редактирование:
Автор
L

lexnett75

Новичок
Сообщения
4
Репутация
0
НУ самое простое, это поиск файлов через
Код:
_FO_FileSearch()

Если уже есть, сравнить их по хэшу и перенести через
Код:
FileMove()

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

Kislyak217

Новичок
Сообщения
5
Репутация
1
Код:
While 1 ; Бесконечный цикл для постоянного мониторинга папки
    Local $sFolder = "C:\FolderToMonitor\" ; Путь к папке для мониторинга
    Local $sDestFolder = "C:\DestinationFolder\" ; Путь к папке для перемещения файлов
    Local $aFiles = _FileListToArray($sFolder, "*", 1) ; Получение списка файлов в папке
    
    For $i = 1 To $aFiles[0] ; Перебор списка файлов
        Local $sFilePath = $sFolder & $aFiles[$i] ; Получение полного пути к файлу
        
        If _FileGetTime($sFilePath, 0, 1) >= _Now() - 300 ; Проверка, был ли файл создан в течение последних 5 минут
            FileMove($sFilePath, $sDestFolder & $aFiles[$i], 1) ; Перемещение файла в назначенную папку
        EndIf
    Next
    
    Sleep(300000) ; Ожидание 5 минут перед повторной проверкой папки
WEnd


Объяснение кода:

  • While 1 - начинаем бесконечный цикл для мониторинга папки
  • Local $sFolder = "C:\FolderToMonitor\" - указываем путь к папке, которую нужно мониторить
  • Local $sDestFolder = "C:\DestinationFolder\" - указываем путь к папке, в которую нужно перемещать файлы
  • Local $aFiles = _FileListToArray($sFolder, "*", 1) - получаем список файлов в папке, используя встроенную функцию AutoIt _FileListToArray()
  • For $i = 1 To $aFiles[0] - перебираем список файлов, начиная с первого (индекс 1)
  • Local $sFilePath = $sFolder & $aFiles[$i] - получаем полный путь к файлу, используя путь к папке и имя файла из списка
  • If _FileGetTime($sFilePath, 0, 1) >= _Now() - 300 - проверяем, был ли файл создан в течение последних 5 минут, используя встроенную функцию AutoIt _FileGetTime(). _Now() - 300 означает "текущее время минус 300 секунд", то есть 5 минут.
  • FileMove($sFilePath, $sDestFolder & $aFiles[$i], 1) - перемещаем файл в назначенную папку, используя встроенную функцию AutoIt FileMove(). Параметр 1 означает "перезаписать файл, если он уже существует".
  • Sleep(300000) - ждем 5 минут перед повторной проверкой папки
 

Oki

Продвинутый
Сообщения
452
Репутация
63
Проверка, был ли файл создан в течение последних 5 минут, лишняя. Файл следует по условию задачи переносить даже в том случае, если был сбой, а тогда время может оказаться намного более 5 минут. Да и без сбоев оно может быть чуточку более 5 минут, так как время не дискретно тикает. Даже за время одного только переноса файлов могут появиться новые файлы ещё до того, как следующий отсчёт 5 минут запустится. Короче говоря, эта проверка просто излишня, её надо убрать (удалить строки 9 и 11).

В остальном похожий скрипт был и у меня сначала план написать, пока топикстартер во втором своём посте не озвучил:
  • немного затруднительное правило именования файлов с одинаковыми именами (это требование в скрипте выше проигнорировано аж настолько, что старые файлы принудительно затираются заданным флагом);
  • требование не давать уснуть;
  • опасения сбоев, а их тоже ведь нужно корректно обработать.
Тоже разрешимые задачи, но требуют чуть большей кропотливости, чем в скрипте выше. Впрочем, на первый взгляд, есть вероятность, что за сбоями следить не нужно, так как все файлы, которые не были успешно перенесены, просто останутся на второй год на следующий проход цикла. Но это надо проверить или детальнее обдумать.
 
Последнее редактирование:
Верх