Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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*.

Последний раз редактировалось amel27, 04-12-2006 в 05:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:21, 03-12-2006 | #2