Доступ К Сетевому Диску, Библиотека И Права

savl

Lotus team
28.10.2011
2 136
105
#1
Ситуация...
Крепит человек файлик с сетевого диска, выбирает через FileOpenDialog, при вставке его в RT-поле вылезает сообщение "File Not Found"
Сначала думал путь к файлу длинный, потом начало такое происходить уже с короткими именами.
Последний файл был общей длинной 194 символа, не 255 же.
Доступ, чаще всего, в папки на сетевых дисках разграничены: одни отделы их видят, другие нет.
И вот тут задумался, права при прикреплении программно в RT поле чьи используются?
Библиотека, в которой прописан весь год был подписана мной, и сервером была тоже, ошибка все равно есть.
Получается что выбирая файл пользователь имеет к нему доступ, а дальнейший код этот файл в упор не видит?
Нашел вот такое сообщение: http://codeby.net/ipb.html?s=&sh...ost&p=52990
Прочел всю ветку, это ад...
Всегда считал, что код в лотусе, почти всегда используется от прав пользователя, а по ходу нет. Или я не прав?
Прошу помощи, в упор не понимаю.

P.S. Я конечно могу сделать на лету простой батник с одной строкой: {copy %1 %2 /Y}, а потом запускать его через Shell, но что-то меня привлекает такое решение, да и пользователи на Mac у нас есть.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#2
Наверное ты что-то не то делаешь или не договариваешь. Если все локально - то права локального пользователя.
Если через агент на сервере - соответственно права серверного пользователя
Еще есть смысл узнать о правах доступа к файлу у пользователя. Встречал такое, что было запрещено копирование с сетевого диска.

Набросал на скорую руку Action
Код:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument	

Dim rtitem As NotesRichTextItem
Dim object As NotesEmbeddedObject

Dim files As Variant


Set doc = ws.CurrentDocument.Document

files = ws.OpenFileDialog(True, "File List", "", "c:")

Set rtitem = New NotesRichTextItem( doc, "Body" )

Forall filelist In files 
Set object = rtitem.EmbedObject	( EMBED_ATTACHMENT, "", filelist)	
End Forall

Call doc.Save( True, False, True )
End Sub
Атачил файл с сетевого диска. Работает нормально. Файл цепляется.
 

savl

Lotus team
28.10.2011
2 136
105
#3
вот на этой строке и ошибка:
Код:
Set object = rtitem.EmbedObject	( EMBED_ATTACHMENT, "", filelist)
Нет файла и все, выполняется из кнопки на представлении.
Права к сетевому диску разграничны через Active Directory, думаю проблема тут.
 

rinsk

Lotus team
12.11.2009
900
44
#4
Если файл можно из проводника куда-скопировать, то будет цеплятся. Иначе такое когда только права list на каталог\файл.
 

duchan

Well-known member
20.09.2006
110
3
#5
А папки небось по русски обзываются, если ДА, то дели 256 на два - русские буквы 2 байта занимают....
Так что если на "шарах" всё по русски, то и в 194 символа может не влезть
 

savl

Lotus team
28.10.2011
2 136
105
#6
DuChan
Мне казалось 256 это именно символов.
Попробую в unicode перевести при прикреплении, там точно в байтах расчет.
 

savl

Lotus team
28.10.2011
2 136
105
#7
Ну в целом да, права были ни при чем. Проблема в 260 символов WinAPI, хотя я всегда думал что русские символы только в Unicode кодируются 2-мя знаками.
Метод преобразования {\\?\} не работает, ровно до первого пробела сработать может, но не нормализует путь.

Теперь копирую файл в локальный темп и тяну оттуда в Lotus, естественно только для win.
Создаю bat-файл filesCopy.bat со строкой: {copy %1 %2 /Y}
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Для тех кто не понял что такое %1, %2 и /Y</div></div><div class="sp-body"><div class="sp-content">
/Y - флаг перезаписи, %i - это параметры, которые указываются при запуске bat
Парметров может быть от %1 - %9, есть еще параметр %0 - имя bat-файла.
При вызове параметры должны разделяться пробелом.
Подробнее тут: http://www.windowsfaq.ru/content/view/264/57/

Затем через WShell.Run запускаю и дожидаюсь окончания.
Код:
ReturnCode = WShell.Run({filesCopy.bat} & { "} & FilePath & {" } & newFilePath, 0, True)
кавычки для FilePath нужны если там есть пробелы, без них не копирует.
0 - не отображать окно, True - дождаться окончания.
Может кому пригодится, хотя..
 

duchan

Well-known member
20.09.2006
110
3
#8
ну уж если Вы используете WSH, может попробывать путь перобразовать к формату "8.3"?
например через "Scripting.FileSystemObject"->ShortPath., правда для сетевых безбуквенных не знаю, заработает или нет - попробуйте... :rolleyes:

Да и скопировать файл можно:
Код:
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile "C:\*.bat", "A:\", 0

CopyFile(<Source>,<Destination>,<Overwrite>)
Назначение: копирует один или несколько файлов.
Параметры:
<Source> - строка, путь к источнику копирования (что копировать). В последнем компоненте параметра можно использовать групповые символы "*" и "?".
<Destination> - строка, путь назначения (куда копировать).
<Overwrite> - необязательный, булево (число). Перезаписывать существующие файлы, или нет. По умолчанию - True (перезаписывать). Если файл, который нужно перезаписать, имеет атрибут read-only, возникнет ошибка (независимо от установки этого параметра).
 

savl

Lotus team
28.10.2011
2 136
105
#9
Кстати да, FSO.CopyFile прекрасно работает. А ожидание конца работы будет?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#10
юникод бывает разный, в винде, русские символы - 2-а знака - это описано (ссылки гуглятся)...
здесь можно сделать исторические отступления ;), но в контексте задачи нет необходимости