Что нового

Как сделать запись в текстовый фал, который занят другой программой.

A

at

Гость
Час Добрый Всем! Прошу помощь.
Есть программа, которая ведет непрерывно запись в свой лог файл. При появлении в лог файле нужной строки мой скрипт должен сменить эту строчку на шаблон. Мой скрипт работает отлично, но проблема заключается в том, что программа, которая ведет лог видимо не дает вносить изменения в свой логфайл в рабочем режиме. Т.е. мой скрипт видит эти строки, но изменить их не может.

скрипт:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm = GUICreate('PROGA', 152, 65, 225, 150)
$vInput_1 = GUICtrlCreateInput('', 32, 8, 105, 21)
$vLabel_Info = GUICtrlCreateLabel(' ... жду строку', 32, 40, 84, 17)
$vCheckbox1 = GUICtrlCreateCheckbox('', 8, 9, 17, 15)
GUISetState(@SW_SHOW)

Global $vScript_Name, $sFile, $sRead

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		EndSwitch
		 If GUICtrlRead($vCheckbox1) = $GUI_CHECKED Then
			 Sleep(100)
			$vScript_Name = GUICtrlRead($vInput_1)
		 EndIf
		
            $sFile = 'C:\prog.log'
			$sRead = FileRead($sFile)
			
			$sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?феррари.*)$')
			$sText_Buy = '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?феррари.*)$'
			$sReplace_Text_Buy = @HOUR & ':' & @MIN & ':' & @SEC & '.' & '<<< ЗАМЕНА СТРОКИ ФЕРРАРИ>>>' & @CRLF

			$sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?Настарт.*?болид.*)$')
			$sText_Sale = '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?болид.*)$'
			$sReplace_Text_Sale = @HOUR & ':' & @MIN & ':' & @SEC & '.' & '<<< ЗАМЕНА СТРОКИ БОЛИД>>>' & @CRLF

		 If $sString_Buy Then

			 Sleep(100)
			$sReplace_Buy = StringRegExpReplace($sRead, $sText_Buy, $sReplace_Text_Buy)
			FileDelete($sFile)
			FileWrite($sFile, $sReplace_Buy)
			 Buy()

		 ElseIf $sString_Sale Then
			 
			 Sleep(100)
			$sReplace_Sale = StringRegExpReplace($sRead, $sText_Sale, $sReplace_Text_Sale)
			FileDelete($sFile)
			FileWrite($sFile, $sReplace_Sale)
			 Sale()
			 
		 EndIf
WEnd

Func Buy()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("ФЕРРАРИ", 32, 40, 84, 17)
EndFunc

Func Sale()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("БОЛИД", 32, 40, 84, 17)
EndFunc



Добавлено:
Сообщение автоматически объединено:

Прошу подсказать, на сколько это возможно реализовать. Другого способа не знаю. Пытаюсь считывать последнюю строку без перезаписи, но тут другая проблема получается. Скрипт просто пропускает изменение в логе (т.е. не видит).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Значит программа открыла лог-файл с доступом "только для чтениня" для других программ. Остается смириться.
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Может быть пусть скрипт создает свой файл и туда пишет тот лог с заменой, а по завершению работы программы - подменять её лог на свой.
 
Автор
A

at

Гость
Но тогда не понятно, почему мой скрипт не успевает читать новый данные из логфайла этой программы. Прошу посмотреть, может ошибка моя.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm = GUICreate('PROGA', 152, 65, 225, 150)
$vInput_1 = GUICtrlCreateInput('', 32, 8, 105, 21)
$vLabel_Info = GUICtrlCreateLabel(' ... жду сигнал', 32, 40, 84, 17)
$vCheckbox1 = GUICtrlCreateCheckbox('', 8, 9, 17, 15)
GUISetState(@SW_SHOW)

Global $vScript_Name, $sFile, $sRead

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		EndSwitch
		 If GUICtrlRead($vCheckbox1) = $GUI_CHECKED Then
			 $vScript_Name = GUICtrlRead($vInput_1)
		 EndIf
		
            $sFile = 'C:\prog.log'
			$sRead = FileReadLine($sFile, -1)
			$sString_Buy = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?БОЛИД.*)$')
			$sString_Sale = StringRegExp($sRead, '(?m)^(.*?\[.*?INFO.*?Script:\(Script:' & $vScript_Name & '\).*?На старт.*?ФЕРАРРИ.*)$')

		 If $sString_Buy Then
			 Buy()

		 ElseIf $sString_Sale Then
			 Sale()
			 
		 EndIf
WEnd

Func Buy()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("БОЛИД", 32, 40, 84, 17)
EndFunc

Func Sale()
		Sleep(10)
$vLabel_Info = GUICtrlCreateLabel("ФЕРАРРИ", 32, 40, 84, 17)
EndFunc


Добавлено:
Сообщение автоматически объединено:

Может быть пусть скрипт создает свой файл и туда пишет тот лог с заменой, а по завершению работы программы - подменять её лог на свой.

Nik_rus, спасибо за вариант, но так Вы предлагаете, сложная перезапись получиться. Я сам думал над этим.
 
Автор
A

at

Гость
Nik_rus, спасибо. Все внимательно изучил и взял на вооружение. Тем более это для меня второй уважаемый сайт после autoit. Думаю все же найти способ попроще. Я имею в виду не перезапись логфайла, а какой-то другой способ отловить нужную информацию из него.
 
Верх