1

Тема: LangMF 7.7: Запись в файл

При написании скрипта логирования событий возникла проблема, никак не могу записать значение изменяемой переменной в файл:
Делаю так

...
file.Open "log.txt", 1, "output"
if logs <>0 then file.Print 1, log
...

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

2 (изменено: Poltergeyst, 2009-02-25 16:43:26)

Re: LangMF 7.7: Запись в файл

Запись в столбик:

<#Module=fileCol>
Sub Load(command)
    buf="Некоторая запись"
    fName=Sys.File.GetFPath(Sys.Path()) & "mylog1.log"
    '---------------------------------------------------
    'Удалите эту строку после создания файла mylog1.log, 
    'чтобы запись производилась в старый экземпляр 
    'этого файла
    Sys.File.FileNew fName    
    '---------------------------------------------------
    Sys.File.FileOpen fName,1,"append"

    j=1
    While j<=10
        Sys.File.FilePrint 1,buf
    j=j+1
    Wend
        Sys.File.FileClose 1    
    EndMF
End Sub
<#Module>

Запись в строку:

<#Module=fileRow>
Sub Load(command)
    buf="Некоторые данные"
    fName=Sys.File.GetFPath(Sys.Path()) & "mylog2.log"
    '---------------------------------------------------
    'Удалите эту строку после создания файла mylog2.log, 
    'чтобы запись производилась в старый экземпляр 
    'этого файла
    Sys.File.FileNew fName    
    '---------------------------------------------------

    Sys.File.FileOpen fName,1,"random"
    j=1
    While j<=10
        Sys.File.FilePut 1,0,buf
    j=j+1
    Wend
        Sys.File.FileClose 1    
    EndMF
End Sub
<#Module>
hiho пишет:

да и сам текст появляеться только тогда, когда скрипт уже отработал.

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


например так(запись в столбик):

<#Module=fileTrass>
Sub Load(command)
    buf="Некоторая запись"
    fName=Sys.File.GetFPath(Sys.Path()) & "mylog1.log"
    '---------------------------------------------------
    'Удалите эту строку после создания файла mylog1.log, 
    'чтобы запись производилась в старый экземпляр 
    'этого файла
    Sys.File.FileNew fName    
    '---------------------------------------------------
    Sys.File.FileOpen fName,1,"append"

    j=1
    While j<=100
        Sys.File.FileOpen fName,1,"append"
        Sys.File.FilePrint 1,buf
        Sys.File.FileClose 1    
    j=j+1
    Wend
        
    EndMF
End Sub
<#Module>

Или так(запись в строку подряд)

<#Module=fileRow>
Sub Load(command)
    buf="Некоторые данные"
    fName=Sys.File.GetFPath(Sys.Path()) & "mylog2.log"
    '---------------------------------------------------
    'Удалите эту строку после создания файла mylog2.log, 
    'чтобы запись производилась в старый экземпляр 
    'этого файла
    Sys.File.FileNew fName    
    '---------------------------------------------------
    j=1
    While j<=10000
        Sys.File.FileOpen fName,1,"random"        
        Sys.File.FilePut 1,CursorPos,buf
        CursorPos=Sys.File.FileLOC(1)
        Sys.File.FileClose 1        
    j=j+1
    Wend
    EndMF
End Sub
<#Module>

3

Re: LangMF 7.7: Запись в файл

В крайнем случае, если время критично (я про открытие/закрытие лога, хотя коллега Poltergeyst прав — именно так и надо делать, потому как в этом случае при вылетании скрипта Вы получите хотя бы часть лога), то можно работать и через стандартный компонент «Scripting.FileSystemObject» — в этом случае в файл пишется сразу, очень удобно наблюдать его заполнение во вьюере Far Manager'а по F3.

4

Re: LangMF 7.7: Запись в файл

to Poltergeyst:

почему так

Sys.File.GetFPath(Sys.Path())

а не так

Sys.Path

5

Re: LangMF 7.7: Запись в файл

Исключительно с целью корректности, благо в справке 7.7 указано:

Sys.Path - Функция позволяет получить полный путь к файлу запущенного скрипта

т.е должна возвращать нечто вроде C:\lalala\topola\script.mf, а на самом деле возвращает только каталог C:\lalala\topola\. Судя по всему это мелкий баг версии 7.7. И если он окажется исправлен atomix' ом в более поздних версиях, то вышеизложенные скрипты при простановке Sys.Path вместо Sys.File.GetFPath(Sys.Path()) будут работать какбы некорректно

P.S.
Хотя меня лично вполне устраивает версия 7.7 - очень хорошая машина.

6

Re: LangMF 7.7: Запись в файл

LangMF 8.0 — аналогично:

msgbox Sys.Path

C:\Мои проекты\

7

Re: LangMF 7.7: Запись в файл

нет он всегда возвращает ТОЛЬКО путь, просто в справке подправлю потом.