Notesstream

Тема в разделе "Lotus - Программирование", создана пользователем NickProstoNick, 14 дек 2010.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Привет!
    Вот еще вопрос... Есть процедура, которая пишет в файл данные.
    Код (LotusScript):
        Dim ws As New NotesUIWorkspace
    Dim session As NotesSession
    Dim db As NotesDatabase
    Dim dc As NotesDocumentCollection
    Dim stream As NotesStream
    Dim pathname As String
    Dim tmp As Variant

    Dim i As Integer

    pathname = "d:\test.txt"

    pathname = ws.OpenFileDialog( False, "Выберите файл",,"d:\", pathname)(0)
    If IsEmpty(pathname) Then
    Exit Sub
    End If 

    Set session = New NotesSession
    Set db = session.CurrentDatabase

    Ret:
    Set stream = session.CreateStream

    If Not stream.Open(pathname) Then
    MessageBox pathname,, "Ошибка открытия файла"
    Exit Sub
    End If

    If stream.Bytes <> 0 Then
    If MessageBox("Файл уже существует и содержит данные. Удалить файл?", 1 + 32, "Внимание") = 1 Then

    Call stream.Close
    Set stream = Nothing

    Kill(pathname)
    GoTo Ret
    Else
    Exit Sub   
    End If

    End If

    Call stream.WriteText("ПРОВЕРКА", EOL_CRLF)
    Call stream.Close
    при первом вызове процедуры stream.Open(pathname) создает файл (файла до этого не существовало). Тут проблем нет.
    Ну так вот в чем собственно проблема... Если при вызове процедуры файл бы - пользователю предлагается пересоздать файл.
    И снова возвращаемся чтоб открыть поток... но тут ошибка "файл не существует"
    Что не так?
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    лучше использовать Call notesStream.Truncate
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    ToxaRat
    Спасибо. помогло
     
  4. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Можно тоже спрошу?
    Например, есть у меня агентик. Он просто открывает файл по некуторому пути. И все.

    Option Public
    Option Declare

    Const FILE_SYNCH_PASS = "C:\FOLDER\"
    Sub Initialize

    Dim s As New NotesSession
    Dim stream As NotesStream

    Set stream = s.CreateStream
    On Error GoTo errorHandler
    If Not stream.Open("C:\xml\u-2249-190813-153932.xml", "WINDOWS-1251") Then
    Print "Open failed"

    Else
    Print "OK"
    End If
    stream.Close
    errorHandler:
    Print "Error" & Str(Err) & ": " & Error$
    End Sub

    Когда пинаю ручками - выводит "OK", все хорошо, файл открывает. А вот обращаюсь к нему через Web браузер.
    Строка запроса http://IP-сервера/DB.nsf/MyAgent?OpenAgent

    Выводит "Open failed".

    Метод Open почему-то не срабатывает. Доступ к файлу менял. Это ограничения Лотуса? Если кто поделится, буду премного благодарен ))
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Может в свойствах агента нужно поставить Allow restricted operation?
     
  6. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Ставил. И Run as Web User тоже.
    В ACL базы у пользователя Anonymous стоит доступ Editor со всеми галочками
     
  7. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Права на папку "C:\xml\" может неверные?
    Ручками от пользователя лотус идет, а через web наверное от другой учетки.
    К другому файлу подцепить проблем нет?
     
  8. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Права на папку "C:\xml\" может неверные?

    Нет, у всех групп пользователей стоят разрешения и на чтение и на запись, как и у самого файла. Папку вообще сделал в общий доступ.
    И пользователю Default добавил права Editor - все равно нет.

    Не открывает даже просто файл txt.
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    По Help 4 причины:
    Предлагаю попробовать открыть другим методом для проверки:
    Код (LotusScript):
    Open "c:\123w\work\thenames.txt" For Input As fileNum%
    просто глянуть что будет.
     
  10. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Да тоже пробобал

    Dim txt As String
    Dim fileNum As Integer
    Dim counter As Integer
    fileNum% = FreeFile()

    Print "Шаг 1"

    Open "C:\xml\u-2249-190813-153932.xml" For Input As fileNum%

    Print "Шаг 2"

    Do While Not EOF(fileNum%)

    Line Input #fileNum%, txt$
    Print txt$

    counter% = counter% + 1
    Loop
    Close fileNum%


    Выводит только строку "Шаг 1" :-(
     
  11. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    значит на open ошибка идет, в log должен ее писать агент.
     
  12. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    log выводит
    HTTP Server: Agent 'MyAgent|MyAgent' error: Unable to open file

    Тут нашел кое-что

    http://www-01.ibm.com/support/docview.wss?uid=swg21084226

    Переместил файл в папку Data. Открывать его агент вроде стал, только вот построчно теперь не читает (
    Код такой

    Dim iNumber As Integer

    Dim sLine As String

    Dim aFile As String

    Dim sMsg As String
    Dim counter As Integer
    aFile = ".\data\u-2249-190813-153932.xml"


    iNumber = FreeFile()
    Print "Шаг 1"
    Open aFile For Input As iNumber
    Print "Шаг 2"
    While Not EOF(iNumber)
    Print "Шаг 3"
    Line Input #iNumber, sLine

    If sLine <>"" Then
    Print sLine
    sMsg = sMsg & sLine & Chr(13)

    End If
    counter% = counter% + 1
    Print "that's all"
    Wend

    Close #iNumber
    Print "Шаг 4"

    Выводит только "Шаг 1", "Шаг 2", "Шаг 4", а все, что в цикле, будто игнорирует

    А вот NotesStream даже из Data не хочет файл открыть, но при этом в лог ошибка не выводится (
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    агент на сервере читает под учеткой SYSTEM (если ниче не меняли в сервисах, запущен как сервис и это винда) эта учетка не везде имеет право залезать...
    дурной тон - выкладывать файлы во внешние каталоги для домины - нарушает секурити. Приложение не должно выходить за границы своего каталога (как пр-ло), да еще лучше - чтобы запускалось от специфичного юзера, кот. тока на data и имеет права писать/читать (ну плюс - необходимые системные)
    а по коду - терь пробуйте со стримом работать
    ищё странность - что хмл в виндовой кодировке (это, мягко-говоря, не лучший вариант)
    UTF-8 - стандарт для мультиязычных приложений (в тырнетах)
     
  14. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Приложение не должно выходить за границы своего каталога

    Ну да, теперь файл в папке data

    да еще лучше - чтобы запускалось от специфичного юзера, кот. тока на data и имеет права писать/читать (ну плюс - необходимые системные)

    Ну, агент подписан учеткой такого пользователя

    а по коду - терь пробуйте со стримом работать

    Да опять то же самое.
    Делаю так

    Open aFile For Output As iNumber%

    On Error GoTo errorHandler

    If Not stream.Open(aFile, "UTF-8") Then
    Print "Open failed"
    Else
    Print "OK"
    End If

    Все равно "Open failed" ( И UTF-8 не повлиял (в файле тоже кодировка изменена)
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    а файл не залочен к-л приложением?
    говорилось о учетки в системе, под кот. запускается домино
     
  16. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    а файл не залочен к-л приложением?

    нет.

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

    агент на сервере читает под учеткой SYSTEM (если ниче не меняли в сервисах, запущен как сервис и это винда) эта учетка не везде имеет право залезать...

    На вкладке Безопасность и система имеет все разрешения и моя учетка имеют все разрешения доступа к файлу и папке, в которой он лежит. Под моей учеткой Лотус запускается, я в группе Админов. Указал себя владельцем файла и папки - не прокатило
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    чудес не бывает, если у агента есть права на рестриктед операции и файл не залочен - стрим откроет его
     
  18. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Создаю просто txt файл Test в папке Data. Назначаю себя его владельцем. И тут стрим не открывает. Разбираю причины.
    1.Путь к файлу пишу так

    ".\data\test.txt"

    Он валидный?

    2. Поток уже открыт.

    Dim s As New NotesSession
    Dim stream As NotesStream

    Set stream = s.CreateStream
    If Not stream.Open(aFile) Then
    Print "Open failed hh"

    Else
    Print "OK"
    End If

    stream.Close

    Поток ведь не может быть открыт до вызова CreateStream

    3. Наполнения поток тоже в таком случае иметь не может

    4. Невалидная кодировка

    Этот txt у меня по умолчанию имеет UTF-8 без BOM
     
  19. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    путь не валидный, надо просто имя файла
    при уже открытом потоке - нельзя его открыть повторно, но уже с файлом (в Лотус скрипте)
    если нужно поместить данные в файл - придется их копировать в др. поток
     
  20. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    О, класс!
    Указал имя файла "test.txt" - и stream стал его открывать ))

    Только вот еще что. После того, как пишу после

    stream.Open(aFile)

    проверку

    If stream.Bytes = 0 Then
    Print aFile & " файл не содержит данных"
    End if

    Он выводит, что файл test.txt не содержит данных. А в нем написано "Hello, World !!!"
     

Поделиться этой страницей