Войти

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


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

proxy
02-04-2009, 16:47
пример (http://forum.ru-board.com/topic.cgi?forum=5&topic=29240&start=756&limit=1&m=1#1) получения подкаталогов с файлами по маске.
легко можно встроить необходимую обработку ))

Lodoss
09-04-2009, 07:53
А как сделать последовательную обработку файлов из этого списка ? В циклах недопонимаю как правильно сделать. Подскажите ?

proxy
09-04-2009, 08:46
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
еще вариант с фильтром по регулярному выражению:
#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
09-04-2009, 12:40
Под "обработкой" я написал в самом начале, требуется открыть последовательно каждый файл, (для пример я привёл тхт), правим его (добавляем пару строк в конце) и сохраняем в родной папке но с другим названием.
В примерах разбираюсь, для меня циклы и массивы пока тёмный лес :help:

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

proxy
09-04-2009, 13:53
Lodoss......amel27, дело говорит....
а по поводу массивов и циклов - почитайте справку, русскую справку (http://www.autoitscript.com/autoit3/docs.shtml), разделы "Применение AutoIt" и "Для новичка"....
а далее уже по всем функциям, обязательно на практике разбирая каждый пример...
потом еще удивитесь - как все легко )))




© OSzone.net 2001-2012