Что нового

Поиск и обработка файлов с расширением .jpg в подкаталогах конкретного каталога

sufx

Новичок
Сообщения
9
Репутация
0
Добрый день товарищи!
Нужна проф. помощь.
Есть задача: камера делает каждые 20 секунд снимок и заливает его на ftp.
Заливает не просто в корень а создает свою папку с динамическим именем(т.е. каждый день новую) формата
ГГГГ-ММ-ДД, внутри которой папка с именем(статическим) камеры, внутри которой папки с именем(статическим) пользователя, а уже там складываются файлы формата ЧЧ-ММ-СС.jpg
Т.е. путь к вайлам такой: C:\ftp1\2012-04-12\IPCam139610\1\*.jpg

Нужно чтобы последний появившийся *.jpg(с динамическим именем), сначала был найден в подкаталогах С:\ftp1 затем переименовывался в статику, а потом перемещался в другую папку, и так по кругу...

Я накалякал вот такой батник:

:loop
ren C:\ftp1\2012-04-12\IPCam139610\1\*.jpg 1.jpg && move /y C:\ftp1\2012-04-12\IPCam139610\1\1.jpg C:\ftp1 && ping -n 1 -w 20000 192.168.254.254 >nul
goto loop

Но он решает проблему с папкой с динамическим именем. Т.е. скрипт однодневка получается=)

Помогите пожалуйста решить проблемму.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Поиск файлов можно произвести с помощью функции _FileDirList()

Код:
#include <Array.au3>

$aList = _FileDirList('C:\ftp1', '*.jpg')
If (IsArray($aList)) And ($aList[0]) Then
    _ArrayDisplay($aList)
Else
    MsgBox(64, 'FileDirList', 'В данном каталоге не было найдено ни одного файла с расширением "*.jpg"')	
EndIf

Func _FileDirList($sPath, $sFileMask = '*', $iFlag = 1, $iSubDir = 1, $iSort = 0)
    Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles
    If Not StringInStr(FileGetAttrib($sPath), 'D') Then
        Return SetError(1, 0, 0)
    EndIf
    If $iSubDir = 1 Then
        $sAttrib &= ' /S'
    EndIf
    If $iSort = 1 Then
        $sAttrib &= ' /O:N'
    EndIf
    Switch $iFlag
        Case 1
            $sAttrib &= ' /A-D'
        Case 2 
            $sAttrib &= ' /AD'
        Case Else 
            $sAttrib &= ' /A'
    EndSwitch
    $sOut = StringToBinary('0' & @CRLF, 2)
    $sPath = StringRegExpReplace($sPath, '\\+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
    $sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
    $aMasks = StringSplit($sFileMask, ';')
    For $i = 1 To $aMasks[0]
        If StringStripWS($aMasks[$i], 8) = '' Then
            ContinueLoop
        EndIf
        $sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
        If $i < $aMasks[0] Then
            $sFiles &= ';'
        EndIf
    Next
    $hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
    While 1
        $sRead = StdoutRead($hDir, False, True)
        If @error Then
            ExitLoop
        EndIf
        If $sRead <> '' Then
            $sOut &= $sRead
        EndIf
    Wend
    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
    If @error Or UBound($aOut) < 2 Then
        Return SetError(2, 0, 0)
    EndIf
    $aOut[0] = UBound($aOut)-1
    Return $aOut
EndFunc

Далее перебираете массив и копируете(перемещаете) файлы куда угодно.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Если хочешь использовать bat файл, этот код поможет
Код:
set outfolder=c:\out



@echo off
setlocal ENABLEDELAYEDEXPANSION
For /F "usebackq" %%i in (`dir *.jpg /b /s`) do (
set fdata=%%~ti
set newname=!fdata::=.!.jpg
move /Y "%%i" "%outfolder%\!newname!"
)


Тут отредактируй строчку set outfolder=c:\out и укажи в какую папку будут скопированны снимки.

Сам батник кидай в C:\ftp1 и оттуда же запускай.
 
Автор
S

sufx

Новичок
Сообщения
9
Репутация
0
Огромное СПАСИБО inververs!!!
Прям выручил! :beer:
 
Верх