biork
п.п.1-4, точно в соответствии с формулировкой (см. примечания):
Код:
#include <File.au3>
#include <Array.au3>
$DIR1 = 'C:\DIR1'
_FilesDelete ($DIR1, '*text_1*')
$DIR2 = 'C:\DIR2'
_FileLinesDelete ($DIR2 & '\' & 'xxx.sif', 'text_1')
$DIR3 = 'C:\DIR3'
Dim $Lines3 [3] = ['text_2', 'text_3', 'text_n']
_InfSectionAddLines ($DIR3 & '\' & 'xxx.inf', 'XXX', $Lines3)
$DIR4 = 'C:\DIR4'
_InfSectionReplaceText ($DIR4 & '\' & 'yyy.inf', 'YYY', 'text_4', 'text_5')
; Удаление файлов в заданном каталоге по маске.
; Возвращает количество удаленных файлов.
Func _FilesDelete ($sPath, $sFilter)
Local $aFiles, $i
$aFiles = _FileListToArray ($sPath, $sFilter, 1)
If IsArray ($aFiles) Then
For $i=1 To $aFiles [0]
FileDelete ($sPath & '\' & $aFiles [$i])
Next
Return $i-1
Else
Return 0
EndIf
EndFunc
; Удаление строк файла по условию вхождения заданного текста
; Возвращает: 1 - успех, 0 - ошибка. Коды ошибок:
; 1 - ошибка чтения файла;
; 2 - ошибка сохранения файла.
Func _FileLinesDelete ($sFilePath, $sEntry)
Local $aFileLines, $i
If _FileReadToArray ($sFilePath, $aFileLines) Then
For $i = $aFileLines [0] To 1 Step -1
If StringInStr ($aFileLines [$i], $sEntry) Then _ArrayDelete ($aFileLines, $i)
Next
If _FileWriteFromArray ($sFilePath, $aFileLines, 1) Then
Return 1
Else
SetError (2)
Return 0
EndIf
Else
SetError (1)
Return 0
EndIf
EndFunc
; Добавление заданного массива строк в секцию INF-файла
; Возвращает: 1 - успех, 0 - ошибка. Коды ошибок:
; 1 - переданный параметр не является массивом;
; 2 - выход за границы индекса;
; 3 - ошибка чтения файла;
; 4 - не найдена секция;
; 5 - ошибка сохранения файла.
Func _InfSectionAddLines ($sFilePath, $sSectionName, ByRef $aNewLines, $iStartIndex=0)
Local $aFileLines, $i
If Not IsArray ($aNewLines) Then
SetError (1)
Return 0
EndIf
If $iStartIndex >= UBound($aNewLines) Then
SetError (2)
Return 0
EndIf
If _FileReadToArray ($sFilePath, $aFileLines) Then
Local $iStart = _ArraySearch ($aFileLines, '[' & $sSectionName & ']', 1)
If $iStart = -1 Then
SetError (4)
Return 0
EndIf
For $i = UBound ($aNewLines)-1 To $iStartIndex Step -1
_ArrayInsert ($aFileLines, $iStart+1, $aNewLines [$i])
Next
If _FileWriteFromArray ($sFilePath, $aFileLines, 1) Then
Return 1
Else
SetError (5)
Return 0
EndIf
Else
SetError (3)
Return 0
EndIf
EndFunc
; Замена текста в пределах заданной секции INF-файла
; Возвращает: 1 - успех, 0 - ошибка. Коды ошибок:
; 1 - ошибка чтения файла;
; 2 - не найдена секция;
; 3 - ошибка сохранения файла.
Func _InfSectionReplaceText ($sFilePath, $sSectionName, $sTextFrom, $sTextTo)
Local $aFileLines, $i
If _FileReadToArray ($sFilePath, $aFileLines) Then
Local $iStart = _ArraySearch ($aFileLines, '[' & $sSectionName & ']', 1)
If $iStart = -1 Then
SetError (2)
Return 0
EndIf
Local $iFinal = _ArraySearch ($aFileLines, '[', $iStart +1)
If $iFinal = -1 Then $iFinal = $aFileLines [0]
If $iFinal > $iStart Then
For $i = $iStart+1 To $iFinal
$aFileLines [$i] = StringReplace ($aFileLines [$i], $sTextFrom, $sTextTo)
Next
If _FileWriteFromArray ($sFilePath, $aFileLines, 1) Then
Return 1
Else
SetError (3)
Return 0
EndIf
EndIf
Else
SetError (1)
Return 0
EndIf
EndFunc
З.Ы. несколько замечаний по формулировке задачи:
- INF-файл не просто текст, поэтому корректней говорить о переопределении параметров секции, а не "замене текста";
- соответственно, по п.4 возможно имелась ввиду замена строк целиком, а не вхождений текста;
- секции могут не отличаться от INI-файлов, в этом случае можно задействовать встроенные ф-ции AutoIT INI*.