Что нового

Цикличное обработка дерева папок с файлами

Tasolcheg

Новичок
Сообщения
27
Репутация
0
Здравствуйте.
Ситуация следующая.
есть дерево папок которое постоянно изменяется. Мне необходимо выполнять определенную команду ко всем файлам и папкам и писать это в лог.
Не могу понять как заставить его заглядывать во все папки. пока получается что он смотрит есть папка и удаляет ее нафиг. в общем так будет проще.
Код:
#include <file.au3>
#include <Array.au3>
$conf = (@ScriptDir & "\conf.ini")
$hSearch = FileFindFirstFile("conf.ini")
If $hSearch = -1 Then
    FileWrite($conf, "\\name-pc\123\111\" & @CRLF & "путь к логу\log.txt" & @CRLF & "первая строка - путь к директории в которой будет производиться чистка" & @CRLF & "вторая строка - путь к файлу с логом и его название" & @CRLF)
    Exit
EndIf
$sDatePC = StringFormat('%.02d.%.02d.%.04d', @MDAY, @MON, @YEAR) ; задаем дату
$sTimePC = StringFormat('%.02d.%.02d', @HOUR, @MIN) ; задаем время
$dir = FileReadLine (@ScriptDir & "\conf.ini", 1)
;FileWrite(@ScriptDir & "\olololo.ini",$dir & @CRLF)
   if @error = 1 Then
	  FileWrite (@ScriptDir & "\error.txt", "Ошибка чтения conf.ini. Неполучается считать первую строку" & @CRLF)
	  Exit
	  EndIf
$logfile = FileReadLine (@ScriptDir & "\conf.ini", 2)
;FileWrite(@ScriptDir & "\olololo.ini",$logfile & @CRLF)
   if @error = 1 Then
	  FileWrite (@ScriptDir & "\error.txt", "Ошибка чтения conf.ini. Неполучается считать вторую строку" & @CRLF)
	  Exit
	  EndIf
;$Fileiskl = FileReadLine (@ScriptDir & "\conf.ini", 3)
;FileWrite(@ScriptDir & "\olololo.ini",$Fileiskl & @CRLF)
;   if @error = 1 Then
;	  FileWrite (@ScriptDir & "\error.txt", "Ошибка чтения conf.ini. Неполучается считать третью строку" & @CRLF)
;	  Exit
;	  EndIf
FileWrite($logfile, "Начало очистки "  & $sTimePC & " " & $sDatePC & @CRLF)
Global $folderarray=_FileListToArray($dir, "*", 2)
$hSearch = FileFindFirstFile("iskl.ini")
If $hSearch = -1 Then
    FileWrite($logfile, "Ненайден файл исключений. Создние файла исключений с полным списком папок корневой директории (" & $dir & ")" & @CRLF)
_FileWriteFromArray (@ScriptDir & "\iskl.ini", $folderarray)
EndIf
$Fileiskl =(@ScriptDir & "\iskl.ini")
Global $aText = FileReadToArray($Fileiskl)
For $i = 0 To UBound($folderarray) - 1
  For $j = 0 To UBound($aText) - 1
    If $folderarray[$i] = $aText[$j] Then
      FileWrite($logfile, "Найдена исключаемая папка: " & $folderarray[$i] & @CRLF)
      ExitLoop
    EndIf
  Next
	 $dirremarray =  _FileListToArray($dir & $folderarray[$i] & "\", "*", 2)
	 $fileremarray = _FileListToArray($dir & $folderarray[$i] & "\", "*", 1)
  If $j = UBound($aText) Then
	  For $k = 1 To UBound($dirremarray) - 1
	  DirRemove($dir & $folderarray[$i] & "\" & $dirremarray[$k], 1)
	 FileWrite($logfile, "Очистка папки: " & $folderarray[$i] & @CRLF)
	 FileWrite($logfile, "-удаление папки: " & $dirremarray[$k] & @CRLF)
		 Next
	  For $q = 1 To UBound($fileremarray) - 1
	  FileDelete($dir & $folderarray[$i] & "\" & $fileremarray[$q])
	 FileWrite($logfile, "-удаление файла: " & $fileremarray[$q] & @CRLF)
		 Next
	 EndIf
  Next
  FileWrite($logfile, "#########################################################################################################" & @CRLF)
а надо что бы он смотрел в папку если есть файлы затирал, а если нету то шел дальше. а если там есть папка то смотрел что в ней. если в ней есть файлы то тер их. если есть папка то залазил и смотрел что в ней. и так до бесконечности. И все это писал в лог.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вам нужно познать функции и рекурсию.
Или воспользуйтесь функцией
Код:
_FileListToArrayRec
, почитайте параметры которые там используются. Найдите тот, который отвечает за рекурсию.
Эта функция составит вам массив файлов которые вы ищите. Дальше пройдетесь один раз по этому массиву и сделаете всю работу.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Если еще не решил, вот пример как я решил эту задачу, может понравится.
Код:
FilesSort_('твоя папка')

Func FilesSort_($_Folder='')
   Local $_NextFile
   ;создаем список вложенных папок и фалов
   Local $_ListFile = FileFindFirstFile($_Folder&'\*.*')
   ;перебираем список
   While 1
	  $_NextFile = FileFindNextFile($_ListFile)
	  If @error Then
		 ;конец списка, выходим с цыкла
		 ExitLoop
	  EndIf
	  ;проверяем папка это или файл
	  If StringInStr(FileGetAttrib($_Folder&'\'&$_NextFile) , 'D') Then
		 ;если папка, то отправляем на проверку вложенных папок и файлов
		 ;так же и здесь можно добавит свои операции с папкой ($_Folder&'\'&$_NextFile)
		 FilesSort_($_Folder&'\'&$_NextFile)
	  Else
		 ;если файл, твои операции с ним ($_Folder&'\'&$_NextFile)
	  EndIf
   WEnd
EndFunc
 
Верх