Последовательная работка файлов из подпапок

Ответить
Аватара пользователя
Lodoss

Последовательная работка файлов из подпапок

Сообщение Lodoss »

Приветствую ! Поделитесь пожалуйста куском кода если у кого есть.

Требуется следующее: имеется папка внутри которой подпапки с файлами (например txt), структура вложений может быть большой.

Нужно последовательно обработать каждый файл и сохранить в "родной" папке но с другим названием.
Аватара пользователя
proxy

Re: Последовательная работка файлов из подпапок

Сообщение proxy »

пример
получения подкаталогов с файлами по маске.

легко можно встроить необходимую обработку ))
Аватара пользователя
Lodoss

Re: Последовательная работка файлов из подпапок

Сообщение Lodoss »

А как сделать последовательную обработку файлов из этого списка ? В циклах недопонимаю как правильно сделать. Подскажите ?
Аватара пользователя
proxy

Re: Последовательная работка файлов из подпапок

Сообщение proxy »

Код:

Код: Выделить всё

Global  $sStartDirPath = @WindowsDir & '\help'
Local   $sEndDirPath = 'c:\help\'
ToolTip('Пожалуйста, подождите...', 10, 70, 'Поиск файлов')
Local   $aFilesPath =  _GetDirsFilesList($sStartDirPath, '*', 1)
_EditAndCopyFiles($aFilesPath, $sEndDirPath)
ToolTip('Готово' & @CRLF & 'Результат в папке: ' & $sEndDirPath, 10, 70, 'Поиск и копирование файлов')
Sleep(3000)
Func _EditAndCopyFiles($aFilesPath, $sDirDest)
;~  В эту функцию вставивайте необходимую обработку.
    $sDirDest = StringRegExpReplace($sDirDest, '\\+$', '')
    Local $i, $sNewFileName, $sNewFileType, $sNewFileDirPath
    ToolTip('Всего файлов: ' & $aFilesPath[0], 10, 70, 'Копирование файлов')
    For $i=1 To $aFilesPath[0]
        $sNewFileName = StringRegExpReplace($aFilesPath[$i], '.+\\(.+)', '\1')
        $sNewFileType = StringRegExpReplace($sNewFileName, '.+\.(.+)', '\1'); новое расширение файла
        $sNewFileName = StringReplace($sNewFileName, '.' & $sNewFileType, '') & ' 2'; новое имя файла
        $sNewFileDirPath = $sDirDest & StringReplace($aFilesPath[$i], $sStartDirPath, '')
        $sNewFileDirPath = StringRegExpReplace($sNewFileDirPath, '(.+)\\.+', '\1'); новая папка файла
        ToolTip('Всего файлов: ' & $aFilesPath[0] & @CRLF & _
                'Копируется файл: ' & $i & @CRLF & _
                'Из: ' & $aFilesPath[$i] & @CRLF & _
                'В: ' & $sNewFileDirPath & '\' & $sNewFileName & '.' & $sNewFileType, _
                10, 70, 'Копирование файлов')
        FileCopy($aFilesPath[$i], $sNewFileDirPath & '\' & $sNewFileName & '.' & $sNewFileType, 1+8); копирование с заменой файлов и созданием + создавать соответствующую структуру папок получателя, если ее нет
    Next
EndFunc
Func _GetDirsFilesList($sStartDirPath, $sFilesMask, $iAddFiles=1, $iAddDirs=0, $sRootPath=1)
    $sStartDirPath = StringRegExpReplace($sStartDirPath, '\\+$', '')
    Local $aRetArray[1], $aSubDirsArr, $sFindNextFile, $sCurrentPath, $iYesAdd
    Local $sFindFirstFile = FileFindFirstFile($sStartDirPath & '\' & $sFilesMask)
    If @error = 1 Then Return SetError(-1); нет искомых файлов
    If $sRootPath == 1 AND $iAddDirs == 1 Then
        $aRetArray[0] += 1
        ReDim $aRetArray[2]
        $aRetArray[1] = $sStartDirPath
    EndIf
    While 1
        $sFindNextFile = FileFindNextFile($sFindFirstFile)
        If @error = 1 Then ExitLoop
        $sCurrentPath = $sStartDirPath & '\' & $sFindNextFile
        $iYesAdd = 0
        If StringInStr(FileGetAttrib($sCurrentPath), 'D') Then
            If $iAddDirs == 1 Then $iYesAdd = 1
        Else
            If $iAddFiles == 1 Then $iYesAdd = 1
        EndIf
        If $iYesAdd == 1 Then
            $aRetArray[0] += 1
            ReDim $aRetArray[$aRetArray[0]+1]
            $aRetArray[$aRetArray[0]] = $sCurrentPath
        EndIf
        $aSubDirsArr = _GetDirsFilesList($sCurrentPath, $sFilesMask, $iAddFiles, $iAddDirs, 0)
        If IsArray($aSubDirsArr) Then
            For $i = 1 To $aSubDirsArr[0]
                $aRetArray[0] += 1
                ReDim $aRetArray[$aRetArray[0]+1]
                $aRetArray[$aRetArray[0]] = $aSubDirsArr[$i]
            Next
        EndIf
    WEnd
    FileClose($sFindFirstFile)
    SetError(0)
    Return $aRetArray
EndFunc
Аватара пользователя
amel27

Re: Последовательная работка файлов из подпапок

Сообщение amel27 »

еще вариант с фильтром по регулярному выражению:



Код:

Код: Выделить всё

#include 
Dim $a
_GetFileList ($a, "C:\TEST", "(?i)\.TXT$")
_ArrayDisplay($a)
Func _GetFileList (ByRef $array, $root, $regExp = ".*")
    If IsArray($array)=0 Then Dim $array[1]=[0]
    Local $search = FileFindFirstFile($root &"\*"), $file
    While 1
        $file = $root & "\" & FileFindNextFile($search)
        If @error Then ExitLoop
        If StringInStr(FileGetAttrib($file), 'D') Then
            _GetFileList ($array, $file, $regExp)
        ElseIf StringRegExp($file, $regExp) Then
            $array[0]+=1
            ReDim $array[$array[0]+1]
            $array[$array[0]]=$file
        EndIf
    WEnd
EndFunc


Цитата Lodoss:



А как сделать последовательную обработку файлов из этого списка ?
Последовательная работка файлов из подпапок




зависит от того, что понимается под "обрабокой"
Аватара пользователя
Lodoss

Re: Последовательная работка файлов из подпапок

Сообщение Lodoss »

Под "обработкой" я написал в самом начале, требуется открыть последовательно каждый файл, (для пример я привёл тхт), правим его (добавляем пару строк в конце) и сохраняем в родной папке но с другим названием.

В примерах разбираюсь, для меня циклы и массивы пока тёмный лес Изображение
Аватара пользователя
amel27

Re: Последовательная работка файлов из подпапок

Сообщение amel27 »

Lodoss, приведите пример обработки одного файла (без циклов и массивов) чтобы было от чего плясать: открытие файла -> преобразование -> формирование нового имени -> сохранение (переделать его для массива дело техники) или с этим тоже проблемы?.. тогда формулируйте детально весь алгоритм обработки файла - какие строки добавляются, имя нового файла, что делать со старым и т.д.
Аватара пользователя
proxy

Re: Последовательная работка файлов из подпапок

Сообщение proxy »

Lodoss......amel27, дело говорит....

а по поводу массивов и циклов - почитайте справку,
русскую справку
, разделы "Применение AutoIt" и "Для новичка"....

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

потом еще удивитесь - как все легко )))
Ответить

Вернуться в «AutoIt»