Показать полную графическую версию : Последовательная работка файлов из подпапок
Приветствую ! Поделитесь пожалуйста куском кода если у кого есть.
Требуется следующее: имеется папка внутри которой подпапки с файлами (например txt), структура вложений может быть большой.
Нужно последовательно обработать каждый файл и сохранить в "родной" папке но с другим названием.
пример (http://forum.ru-board.com/topic.cgi?forum=5&topic=29240&start=756&limit=1&m=1#1) получения подкаталогов с файлами по маске.
легко можно встроить необходимую обработку ))
А как сделать последовательную обработку файлов из этого списка ? В циклах недопонимаю как правильно сделать. Подскажите ?
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
еще вариант с фильтром по регулярному выражению:
#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
А как сделать последовательную обработку файлов из этого списка ? »зависит от того, что понимается под "обрабокой"
Под "обработкой" я написал в самом начале, требуется открыть последовательно каждый файл, (для пример я привёл тхт), правим его (добавляем пару строк в конце) и сохраняем в родной папке но с другим названием.
В примерах разбираюсь, для меня циклы и массивы пока тёмный лес :help:
Lodoss, приведите пример обработки одного файла (без циклов и массивов) чтобы было от чего плясать: открытие файла -> преобразование -> формирование нового имени -> сохранение (переделать его для массива дело техники) или с этим тоже проблемы?.. тогда формулируйте детально весь алгоритм обработки файла - какие строки добавляются, имя нового файла, что делать со старым и т.д.
Lodoss......amel27, дело говорит....
а по поводу массивов и циклов - почитайте справку, русскую справку (http://www.autoitscript.com/autoit3/docs.shtml), разделы "Применение AutoIt" и "Для новичка"....
а далее уже по всем функциям, обязательно на практике разбирая каждый пример...
потом еще удивитесь - как все легко )))
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.