Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Последовательная работка файлов из подпапок (http://forum.oszone.net/showthread.php?t=136587)

Lodoss 02-04-2009 12:18 1081813

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

proxy 02-04-2009 16:47 1082063

пример получения подкаталогов с файлами по маске.
легко можно встроить необходимую обработку ))

Lodoss 09-04-2009 07:53 1088553

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

proxy 09-04-2009 08:46 1088588

Код:

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 09-04-2009 12:12 1088759

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

#include <array.au3>

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 09-04-2009 12:40 1088780

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

amel27 09-04-2009 13:47 1088823

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

proxy 09-04-2009 13:53 1088828

Lodoss......amel27, дело говорит....
а по поводу массивов и циклов - почитайте справку, русскую справку, разделы "Применение AutoIt" и "Для новичка"....
а далее уже по всем функциям, обязательно на практике разбирая каждый пример...
потом еще удивитесь - как все легко )))


Время: 12:49.

Время: 12:49.
© OSzone.net 2001-