• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

Notesstream

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#1
Привет!
Вот еще вопрос... Есть процедура, которая пишет в файл данные.
Код:
	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) создает файл (файла до этого не существовало). Тут проблем нет.
Ну так вот в чем собственно проблема... Если при вызове процедуры файл бы - пользователю предлагается пересоздать файл.
И снова возвращаемся чтоб открыть поток... но тут ошибка "файл не существует"
Что не так?
 
A

Anonimous

#4
Можно тоже спрошу?
Например, есть у меня агентик. Он просто открывает файл по некуторому пути. И все.

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 почему-то не срабатывает. Доступ к файлу менял. Это ограничения Лотуса? Если кто поделится, буду премного благодарен ))
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#5
Может в свойствах агента нужно поставить Allow restricted operation?
 
A

Anonimous

#6
Ставил. И Run as Web User тоже.
В ACL базы у пользователя Anonymous стоит доступ Editor со всеми галочками
 

savl

Lotus team
28.10.2011
2 135
104
#7
Права на папку "C:\xml\" может неверные?
Ручками от пользователя лотус идет, а через web наверное от другой учетки.
К другому файлу подцепить проблем нет?
 
A

Anonimous

#8
Права на папку "C:\xml\" может неверные?

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

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

savl

Lotus team
28.10.2011
2 135
104
#9
По Help 4 причины:
The path name is not valid.
The stream is already open.
The stream has content.
Parameter charset$ is not a valid character set.
Предлагаю попробовать открыть другим методом для проверки:
Код:
Open "c:\123w\work\thenames.txt" For Input As fileNum%
просто глянуть что будет.
 
A

Anonimous

#10
Да тоже пробобал

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" :-(
 

savl

Lotus team
28.10.2011
2 135
104
#11
значит на open ошибка идет, в log должен ее писать агент.
 
A

Anonimous

#12
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 не хочет файл открыть, но при этом в лог ошибка не выводится (
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#13
агент на сервере читает под учеткой SYSTEM (если ниче не меняли в сервисах, запущен как сервис и это винда) эта учетка не везде имеет право залезать...
дурной тон - выкладывать файлы во внешние каталоги для домины - нарушает секурити. Приложение не должно выходить за границы своего каталога (как пр-ло), да еще лучше - чтобы запускалось от специфичного юзера, кот. тока на data и имеет права писать/читать (ну плюс - необходимые системные)
а по коду - терь пробуйте со стримом работать
ищё странность - что хмл в виндовой кодировке (это, мягко-говоря, не лучший вариант)
UTF-8 - стандарт для мультиязычных приложений (в тырнетах)
 
A

Anonimous

#14
Приложение не должно выходить за границы своего каталога

Ну да, теперь файл в папке 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 не повлиял (в файле тоже кодировка изменена)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#15
а файл не залочен к-л приложением?
да еще лучше - чтобы запускалось от специфичного юзера, кот. тока на data и имеет права писать/читать (ну плюс - необходимые системные)
говорилось о учетки в системе, под кот. запускается домино
 
A

Anonimous

#16
а файл не залочен к-л приложением?

нет.

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

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#17
чудес не бывает, если у агента есть права на рестриктед операции и файл не залочен - стрим откроет его
 
A

Anonimous

#18
Создаю просто 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
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 583
269
#19
1.Путь к файлу пишу так

".\data\test.txt"

Он валидный?

2. Поток уже открыт.
путь не валидный, надо просто имя файла
при уже открытом потоке - нельзя его открыть повторно, но уже с файлом (в Лотус скрипте)
если нужно поместить данные в файл - придется их копировать в др. поток
 
A

Anonimous

#20
О, класс!
Указал имя файла "test.txt" - и stream стал его открывать ))

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

stream.Open(aFile)

проверку

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

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