Что нового

Запись в несколько файлов

BORIS09087

Новичок
Сообщения
20
Репутация
0
Всем здравствуйте. Нужна помощь по одному вопросу. Задача - переписать текст во всех файлах с одинаковым названием во всех
вложенных папках корневого каталога. Допустим, есть каталог на Рабочем столе, в нём сотня папок с РАЗНЫМИ именами, но в каждой
из папок есть файл с одним названием. Типа C:\Users\Desktop\ КАТАЛОГ\ПАПКА 1\AUTO.au3 , C:\Users\Desktop\ КАТАЛОГ\ПАПКА 2\AUTO.au3
и т.д. Нужно переписать значения во всех одноимённых файлах, во всех папках. Допустим поменять в КАЖДОМ файле AUTO.au3 слово
"ЗАПИСЬ" на "RECORD". Пытался так...

Код:
#include <Array.au3>
#include <FileOperations.au3>

$timer = TimerInit()
$FileList = _FO_FileSearch(@ScriptDir, 'AUTO.au3', True, 125, 2, 2, 0)
$timer = Round(TimerDiff($timer) / 1000, 2) & ' сек'
_ArrayDisplay($FileList, $timer & ' - AUTO.au3') ; показать найденые файлы
$i = 0
While $i < UBound($FileList)
$Read = FileRead($FileList[$i])
$Replace = StringReplace($Read, 'ЗАПИСЬ', 'RECORD')
FileDelete($Read)
FileWrite($Read, $Replace)
$i += $i
WEnd



Не выходит....Подскажите как лучше сделать?...
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Автор
B

BORIS09087

Новичок
Сообщения
20
Репутация
0
Сделал так...

Код:
#include <Array.au3>
#include <FileOperations.au3>

$timer = TimerInit()
$FileList = _FO_FileSearch(@ScriptDir, 'AUTO.au3', True, 125, 2, 2, 0)
$timer = Round(TimerDiff($timer) / 1000, 2) & ' сек'
_ArrayDisplay($FileList, $timer & ' - AUTO.au3') ; показать найденые файлы
$i = 0
While $i < UBound($FileList)
$Read = FileRead($FileList[$i])
$Replace = StringReplace($Read, 'ЗАПИСЬ', 'RECORD')
FileDelete( $FileList[$i])
FileWrite( $FileList[$i], $Replace)
$i += 1
WEnd


Всё равно не работает, файлы находит, но не меняет содержимое...
 

All2khoff

Продвинутый
Сообщения
352
Репутация
65
Код:
_FO_FileSearch

этим запросом мы получаем только список файлов но не путь до файла, следовательно скрипт каждый раз в цикле пишет просто в файл auto.au3 на рабочем столе
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Привет!
М.б. не изобретать велосипед с _FO_FileSearch, а воспользоваться штатным Dir?
Примерно так, с примитивной обработкой ошибок
Код:
Opt('MustDeclareVars', True)
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
; #include <FileOperations.au3> ;;; почему-то этого include у меня нет :(
; ──────────────
Local Const _
  $csTemp = @TempDir & '\xxx.txt', _        ; список файлов для обработки
  $csCmd = 'cmd /u /c dir /b /s %s >"%s"'   ; болванка команды сбора файлов
Local _
  $sFindWhat,         _ ; что будем искать
  $sFindCmd,          _ ; команда сбора списка файлов
  $hTemp,             _ ; хендл списка файлов
  $aFileList,         _ ; массив имён файлов с полными путями
  $sFileText,         _ ; содержимое очередного файла
  $iErr = 0, $i             ;
  ;
Do
  $sFindWhat = @ScriptDir & '\AUTO.au3'                   ; точка старта
  $sFindCmd  = StringFormat($csCmd, $sFindWhat, $csTemp)  ; сформировать команду сбора имён
  $iErr = RunWait($sFindCmd, '', @SW_HIDE)
  If $iErr Then
    MsgBox($MB_ICONSTOP, @ScriptName, 'Облом сбора списка файлов в ' & $csTemp)
    ExitLoop
  EndIf
  ;
  $hTemp = FileOpen($csTemp, $FO_UNICODE)
  If $hTemp = -1 Then
    $iErr = 1
    MsgBox($MB_ICONSTOP, @ScriptName, 'Облом открытия ' & $csTemp)
    ExitLoop
  EndIf
  $aFileList = FileReadToArray($hTemp)
  $iErr = @error
  FileClose($hTemp)
  If $iErr Then
    MsgBox($MB_ICONSTOP, @ScriptName, 'Облом чтения ' & $csTemp)
    ExitLoop
  EndIf
  _ArrayDisplay($aFileList, 'AUTO.au3') ; показать найденые файлы
  ;
  For $i = 0 To UBound($aFileList)-1
    $sFileText = FileRead($aFileList[$i])
    #cs
    А что делать с такими словами, как "ПЕРЕЗАПИСЬ"?
    По-хорошему здесь бы задействовать StringRegExpReplace…
    Да и счётчик исправленных файлов не помешал бы, хотя бы для отчёта
    #ce
    $sFileText = StringReplace($sFileText, 'ЗАПИСЬ', 'RECORD')
    ;
    If (@extended < 1) Then ContinueLoop  ; в тек. файле нечего заменять - крутим цикл дальше
    FileDelete($aFileList[$i])
    FileWrite($aFileList[$i], $sFileText)
  Next
Until (True)
FileDelete($csTemp)   ; чистим за собой мусор в Temp
Exit
PS xxx.rar = «подопытные кролики», yyy.rar = результат заены
 

Вложения

  • xxx.rar
    928 байт · Просмотры: 2
  • yyy.rar
    829 байт · Просмотры: 1
Автор
B

BORIS09087

Новичок
Сообщения
20
Репутация
0
Спасибо большое, попробую этот вариант!
 
Верх