Что нового

Ограничение размера файла в _FileWriteLog()

BaRsupillamy

Новичок
Сообщения
58
Репутация
0
Можно ли дописать функцию _FileWriteLog(), чтобы третьим параметром передавать или размер файла в байтах или количество строк в файле, при превышении которых начиналось бы удалении последних строк при ведении лога?
Пишу подробные логи, размер уходит слишком далеко, а тут возникла необходимость эти файлы закидывать на ФТП. И хочется как-то ограничить размер лог-файлов.
Спасибо.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
или количество строк в файле, при превышении которых начиналось бы удалении последних строк при ведении лога?
Что, если задействовать
Код:
_FileCountLines()

Например
Код:
#include <file.au3>
$FileLog = @ScriptDir & "\my.log"
While 1   
   _FileWriteLog($FileLog, "Текст")
   $CountLines = _FileCountLines($FileLog)
   If $CountLines > 10 Then
	  _FileWriteToLine($FileLog, 1, "", 1)
	  ExitLoop
   EndIf
WEnd
MsgBox(64, "Результат", "В файле my.log уже " & _FileCountLines($FileLog) & " строк.")
 
Автор
B

BaRsupillamy

Новичок
Сообщения
58
Репутация
0
ну не совсем то... мы просто будем перезаписывать первую строку? надо чтобы все строки смещались вниз, а последние удалялись.
можно с помощью сторонних функций самому организовать. но хочется же попроще...
например, используя _FileCountLines() и применив функцию Creator'a из вот этой темы http://autoit-script.ru/index.php/topic,254.0.html , можно сделать то, что нужно... но так как именно Creator стоит как соавтор _FileWriteLog(), я думал, может именно он и добавит ещё чуть чуть функционала.
 
Автор
B

BaRsupillamy

Новичок
Сообщения
58
Репутация
0
никого не заинтересовало? а то у меня уже лог-файлы становятся большими...
придётся, видимо, самому изобретать...
 

ArtInt

Знающий
Сообщения
135
Репутация
18
Извиняюсь за некропостинг

BaRsupillamy
Всё же элементарно -
Отслеживаем кол-во строк в файле, если их больше N, тогда после записи своей лог информации удаляем кол-во строк = кол-ву строк в записанной информации

Строки можно считать по @LF


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

Будет время, совмещу всё это, вундервафля вышла бы полезная :smile:
 
Автор
B

BaRsupillamy

Новичок
Сообщения
58
Репутация
0
да знаю, что не сложно... хотелось, чтобы было ещё проще :smile:
я же даже привёл пример, откуда функции брать... но сам делать не стал, было лень... и не особо надо...
 

ArtInt

Знающий
Сообщения
135
Репутация
18
BaRsupillamy
Как-то так:

Код:
#include <file.au3>

_FileWriteLog ("1.txt","1.1"&@CRLF&"1.2"&@CRLF&"1.3")
newFileWriteLog("2.1"&@CRLF&"2.2"&@CRLF&"2.3","1.txt",4)

Func newFileWriteLog ($text,$path,$maxlines)
   
   $textlines = StringSplit (StringStripCR($text),@LF)
   $textlines = $textlines[0]
   If $textlines>$maxlines then Return 0
   If $textlines=$maxlines then 
	  FileDelete ($path)
	  _FileWriteLog ($path,$text)
	  Return 1
   EndIf
   
   _FileWriteLog($path, $text)
   $FileLines = _FileCountLines ($path)

   If $FileLines>$MaxLines then
	  msgbox ("","","В файле записано "&$filelines&" строк, а максимально возможно - "&$maxlines&". Поэтому, строчки с 1-й по "&($filelines-$maxlines)&"-ю будут удалены!")
	  For $i = 1 to $FileLines-$Maxlines
		 _FileDeleteLine ($path,$i)
		 msgbox ("","","В файле теперь "&_FileCountLines ($path)&" строк, ведь удалена "&$i&"-я.")
	  Next
   EndIf
   
EndFunc





Func _FileDeleteLine($sFile, $iLine)
    $hFile = FileOpen($sFile, 0)
    If $hFile = -1 Then Return SetError(1, 0, 0)
   
    $sFileContent = ""
    $aFileContent = StringSplit(StringStripCR(FileRead($hFile)), @LF)
   
    FileClose($hFile)
   
    For $i = 1 To $aFileContent[0]
        If $i <> $iLine Then $sFileContent &= $aFileContent[$i] & @CRLF
    Next
   
    $hFile = FileOpen($sFile, 2)
    If $hFile = -1 Then Return SetError(2, 0, 0)
   
    FileWrite($hFile, StringTrimRight($sFileContent, 2))
    Return FileClose($hFile)
EndFunc


Однако работает как-то некорректно... Даже не знаю. Надо спросить у автора функции _FileDeleteLine
 
Верх