Цитата Dodakaedr:
если у файла hosts стоит атрибут "только чтение", то снять его, записать некоторое значение и снова поставить атрибут "только чтение", а если атрибута нету то просто записать значение? »
|
Код:
Function test
${GetFileAttributes} "$DESKTOP\hosts" "READONLY" $R0 ; проверяем, есть ли атрибут только чтение у файла, если после исполнения команды $R0 = 1, значит есть
StrCmp $R0 "1" 0 +2 ; если атрибут есть, то ставим файлу обычный атрибут
SetFileAttributes "$DESKTOP\hosts" "NORMAL"
FileOpen $0 "$DESKTOP\hosts" a ; открываем файл для добавления данных
FileSeek $0 0 END ; перескакиваем на последнюю строку в файле
FileWrite $0 "$\r$\n127.0.0.1 winxpregp.narod.ru" ; добавляем новую строку
FileClose $0 ; закрываем файл, завершаем с ним работу
StrCmp $R0 "1" 0 +2 ; т.к. переменная $R0 до сих пор хранит инфу о том, был ли атрибут только чтение у файла, тут же проверяем, если был - ставим обратно атрибут только чтение
SetFileAttributes "$DESKTOP\hosts" "READONLY"
FunctionEnd
Цитата Dodakaedr:
И как удалять значение из файла hosts? »
|
Вы не представляете, сколько уже раз здесь задавались вопросы по поводу работы с обычными текстовыми файлами...
Но такого кода ещё не было, свежачок
Код:
Function test2
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
${WordFind} "$R3" "winxpregp.narod.ru" "E+1{" $R2 ; ищем фразу в строке
IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и читаем следующую строку, если фраза найдена - спускаемся дальше по коду
${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
${LineSum} "$DESKTOP\hosts" $R0 ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow
end:
FunctionEnd
Function DeleteLineCallback
StrCpy $0 SkipWrite
Push $0
FunctionEnd
ps
в начале кода пропишите
Код:
!include "FileFunc.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"