Что нового

Необходимо открыть файл и проверить содержание последней строки.

Mazilezz

Новичок
Сообщения
3
Репутация
0
Версия AutoIt: 3.
Доброго времени суток.
Описание:
Собственно как и в самом названии темы, требуется написать скрипт который по заданному пути (к примеру C:\Users\User\Desktop\log.txt) откроет текстовый файл и проверит содержимое его последней строки. С возвращаемыми параметрами
● 1 - ошибки нет (найден RESULT: 0)
● 0 - есть ошибка (не найден RESULT: 0)
● -1 - файл не найден, не удалось считать содержимой файла и т.д. (любая
возможная ошибка при выполнении задачи)
Работаю с AutoIt третий день и из-за скудных знаний не предполагаю с какой стороны подойти. Заранее спасибо.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
#include <File.au3>

$sPathLog = "C:\Users\Medic84\Desktop\log.txt" ;путь до файла
$sComparingString = "RESULT: 0" ;с чем сравнивать результат

$iLines = _FileCountLines($sPathLog)
If @error Then Exit -1               ;если файл не найден или его не  удалось открыть то выход с кодом -1

If FileReadLine($sPathLog ,$iLines) == $sComparingString Then      ;условие проверки с учетом регистра
	Exit 0       ;все впорядке
Else
	Exit 1       ; не совпало - выход с кодом 1
EndIf


Что бы преобразовать скрипт в функцию нужно заменить Exit на нужный Return
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Вот еще.
Код:
#include <file.au3> ;подключить библиотеку file.au3

$DirFile = @DesktopDir&"\log.txt" ;путь к файлу
$String = "RESULT: 0" ;строка-эталон для сравнения

If Not FileExists($DirFile) Then ;если файл не существует, тогда
    MsgBox(16,"Ошибка", "Файл не найден") ;сообщить и 
	Exit ;завершить
EndIf
 
$CountLines = _FileCountLines($DirFile) ;узнать сколько всего строк в файле
$file = FileOpen($DirFile, 0) ;открыть файл для чтения
If $file = -1 Then ;если не получилось открыть, тогда
    MsgBox(16, "Ошибка", "Не удалось открыть файл") ;сообщить 
    Exit ;и выйти
EndIf
$line = FileReadLine($DirFile, $CountLines) ;прочесть последнюю строку
MsgBox(64, "Содержание строки", $line)
FileClose($file);закрыть ранее открытый файл

If $line = $String Then ;сравнить строку с эталоном
	MsgBox(64, "Инфо", "Последняя строка соответствует")
Else
	MsgBox(48, "Инфо", "Последняя строка не соответствует")
EndIf
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
$file = FileOpen($DirFile, 0) ;открыть файл для чтения
If $file = -1 Then ;если не получилось открыть, тогда
    MsgBox(16, "Ошибка", "Не удалось открыть файл") ;сообщить 
    Exit ;и выйти
EndIf
;somecode
FileClose($file);закрыть ранее открытый файл

Открывать и закрывать файл для одного действия вовсе не обязательно. Если это делается только для проверки на ошибку открытия, то это делает _FileCountLines($DirFile) и выдаст ошибку если он его не смог открыть :smile:
Да и проверять на наличие собственно нет смысла :smile:
 
Автор
M

Mazilezz

Новичок
Сообщения
3
Репутация
0
Спасибо за помощь, буду разбираться. :smile:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Открывать и закрывать файл для одного действия вовсе не обязательно.
Да, согласен.
Так будет лучше:
Код:
$CountLines = _FileCountLines($DirFile)
If  @Error = 1 Then
    MsgBox(16, "Ошибка", "Не удалось открыть файл")
    Exit
EndIf
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вы может не в курсе, но FileReadLine($sFile, -1) прочитает последнюю строку, о чём указано в справке ;).
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Ещё как вариант.

Код:
Switch Test(@ScriptDir & '\1.txt', 'RESULT: 0')
    Case -1 
	    MsgBox(16, 'Ошибка', 'Файл не найден.')
	Case 0
        MsgBox(48, 'Ошибка', 'Есть ошибка.')
    Case 1
        MsgBox(64, 'Info', 'Ошибки нет.')		
EndSwitch	

Func Test($sPath, $sFind)
	If (Not FileExists($sPath)) Then
		Return -1
	EndIf
	Local $hFile = FileOpen($sPath)
    Local $sRead = FileRead($hFile)
    FileClose($hFile)
	Local $sLine = StringSplit($sRead, @CRLF, 1)
    If IsArray($sLine) Then
		If ($sLine[$sLine[0]] == $sFind) Then
			Return 1
		EndIf
	EndIf	
	Return 0		
EndFunc
 
Автор
M

Mazilezz

Новичок
Сообщения
3
Репутация
0
А вот ещё такой вопрос. Как можно реализовать проверку последней строки, но с определенными параметрами, то есть мне не нужно проверять всю строку, а лишь есть ли там запись "RESULT: 0" или "RESULT: 1" ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Mazilezz [?]
мне не нужно проверять всю строку, а лишь есть ли там запись "RESULT: 0" или "RESULT: 1" ?
Код:
$iRet = _TestLine('C:\Users\User\Desktop\log.txt', -1, 'RESULT: 0')
MsgBox(64, '_TestLine', 'Result: ' & $iRet & @CRLF & 'Error: ' & @error)

$iRet = _TestLine('C:\Users\User\Desktop\log.txt', -1, 'RESULT: 1')
MsgBox(64, '_TestLine', 'Result: ' & $iRet & @CRLF & 'Error: ' & @error)

Func _TestLine($sFile, $iLine, $sTest)
	Local $sLine = FileReadLine($sFile, $iLine)
	If @error Then Return SetError(1, 0, -1)
	
	If StringInStr($sLine, $sTest, 2) Then Return 1
	Return 0
EndFunc
 

skifstep

Новичок
Сообщения
1
Репутация
0
Подскажите как проверять в последних N строках ?
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
skifstep
Вообще нужно было создать тему, ваш вопрос отличается от текущей темы...
http://www.autoitscript.com/forum/topic/143295-filereadline-can-you-read-second-last-line/page__st__20#entry1009463
 
Верх