Переместить/скопировать папку с ее дочерними элементами в Livelink

Я уже использую следующий код для копирования файла в Livelink:

Public Function saveFileLL(target As Long, pathSource As String, fileName As String) As Boolean
    Dim dav As New ADODB.Record
    Dim files As New ADODB.Recordset
    Dim objStream As New ADODB.Stream
    Dim url As String

    If Not Val(Nz(target, 0)) > 0 Or Not pathSource Like "*.*" Or Not fileName Like "*.*" Then
        saveFileLL = False
        Exit Function
    End If

    url = URL_LIVELINK_DAV & target

    dav.Open url, , adModeReadWrite
    Set files = dav.GetChildren

    If Not (files.BOF And files.EOF) Then files.MoveFirst

    Do Until files.EOF
        If fileName Like Replace(files("RESOURCE_DISPLAYNAME"), "_", "?") Then Exit Do
        files.MoveNext
    Loop

    If files.EOF Then
        files.addnew "RESOURCE_PARSENAME", fileName
        files.Update
    End If

    files.Close
    dav.Close

    objStream.Open "URL=" & url & "/" & fileName, adModeWrite
    objStream.Type = adTypeBinary
    objStream.LoadFromFile pathSource
    objStream.Flush
    objStream.Close

    Set dav = Nothing
    Set files = Nothing
    Set objStream = Nothing

    saveFileLL = True
End Function

Теперь, как следует из названия, я хотел бы сделать то же самое, но с папкой. Я предполагаю, что мой вопрос на самом деле не связан с Livelink, а больше связан с тем, как обращаться с папками в целом. Можно ли переместить папку со всеми его дочерними элементами, не перебирая все подпапки/файлы? Как я могу адаптировать свою функцию saveFileLL() для этого?

ИЗМЕНИТЬ:

Вот еще одна часть кода, которая позволяет мне напрямую создать одну папку в папке Livelink, разработанной objId.

Public Function CreateFolderToLLFolder(ObjId As String, folderName As String, Optional getId As Boolean = False) As String
    Dim davfile As New ADODB.Record
    Dim davFiles As New ADODB.Recordset
    Dim davDir As New ADODB.Record

    Dim newDirFields(1) As Variant
    Dim newDirValues(1) As Variant

    newDirFields(0) = "RESOURCE_PARSENAME"
    newDirValues(0) = folderName
    newDirFields(1) = "RESOURCE_ISCOLLECTION"
    newDirValues(1) = True

    Set davDir = connection(ObjId, "")
    Set davFiles = davDir.GetChildren()
    If (davFiles.Supports(adAddNew)) Then
        davFiles.addnew newDirFields, newDirValues
    End If

    davfile.Open davFiles, , adModeReadWrite
    CreateFolderToLLFolder = davfile.fields("urn:x-opentext-com:ll:properties:nodeid").value
End Function

Public Function connection(ObjId As String, Optional filename As String = "") As ADODB.Record
    Dim davDir As New ADODB.Record
    davDir.Open filename, "URL=http://livelink-server/livelinkdav/nodes/" & ObjId & "/", adModeReadWrite, adFailIfNotExists, DelayFetchStream, "", ""
    Set connection = davDir
End Function

Не спрашивайте меня, почему это работает, я нашел это, и это работает. objId для тех, кому интересно, это уникальный идентификатор, который Livelink дает всем своим файлам/папкам.

Спасибо.


person dan    schedule 15.01.2013    source источник
comment
Немного да, но я не могу найти много документации об API Livelink. Я добавил некоторые детали в свой исходный пост, я нашел умный способ создать папку. Это кажется быстрым, я, вероятно, закончу циклом по своей папке, чтобы создать все папки/подпапки.   -  person dan    schedule 16.01.2013
comment
Для этих целей можно использовать инструмент DMS-Shuttle for LiveLink. Он может загружать/загружать структуры папок со своими дочерними элементами в/из LiveLink. Существует пробная версия: dms-shuttle.com/downloads. Для студентов это бесплатно. Отказ от ответственности: я работаю в компании.   -  person A.Weber    schedule 16.12.2016


Ответы (2)


Вы можете сохранить весь набор папок и составляющих его файлов/подпапок как один блок, заархивировав их, а затем загрузив zip-файл. Например, http://www.rondebruin.nl/windowsxpzip.htm

Если вы хотите отразить структуру в LiveLink, вам придется изучить дерево папок для репликации содержимого, но есть много кода vba для циклического обхода файлов и деревьев папок, и все они могут вызывать вашу функцию saveFileLL, если вам нужно пойти по этому пути.

person James Snell    schedule 15.01.2013
comment
Проблема в том, что сервер пингуется с частотой ~1500 мс. Если мне нужно зациклиться, чтобы создать ~ 50 папок, это 50x1,5 с, что занимает много времени. А поскольку мне нужно копировать всегда одну и ту же структуру папок, я могу один раз заархивировать ее вручную. Но как один раз разархивировать в Livelink? - person dan; 16.01.2013
comment
Сюжет закручивается! Я недостаточно знаю о LL, чтобы сказать, можете ли вы распаковать zip на стороне сервера. Но поскольку задержка кажется очень высокой, я бы разобрал таймеры с высоким разрешением (Win32 API) и посмотрел, где находится задержка, и это может дать вам некоторые идеи. В противном случае вы можете подключить диск к серверу LL, это быстрее или, по крайней мере, работает без блокировки потока? - person James Snell; 16.01.2013
comment
Это не быстрее, но также работает и может помочь переместить всю папку без необходимости вручную программировать цикл. Действительно, он блокирует поток. Я никогда не слышал о какой-либо многопоточности в VBA: ( - person dan; 16.01.2013
comment
Я думаю о сопоставлении, чтобы создать кеш во временной папке, которая будет быстрой в VBA, поскольку она будет в локальном хранилище. Затем используйте Shell(), чтобы запустить сценарий вне вашего приложения, чтобы выполнить процесс копирования с высокой задержкой, возможно, даже с использованием многопоточного копировщика, такого как robocopy, и поскольку VBA не выполняет эту работу, ваш поток vba и приложение теперь могут делать что-то еще. Как это захватывает вас? - person James Snell; 17.01.2013
comment
Наконец-то мне удалось поговорить с кем-то, кто действительно знает, как разрабатывать Livelink (как я уже сказал, в Интернете почти нет ресурсов, это странно). Livelink также является веб-службой, я мог бы выполнить всю свою работу, обратившись к этой веб-службе. Теперь я узнаю, как разместить некоторые данные по правильному URL-адресу и посмотреть, что он делает. Спасибо за вашу помощь. - person dan; 17.01.2013
comment
Я ответил на свой вопрос, чтобы показать, с чем я наконец пришел. Надеюсь, это поможет некоторым другим людям. - person dan; 17.01.2013

Самый простой способ выполнить то, что я хочу, — это, наконец, использовать веб-сервис, интегрированный в Livelink. Поскольку в Интернете действительно не так много информации обо всем API Livelink (это удивительно, учитывая все, что мы можем найти в Google в эти дни), я хочу опубликовать здесь свое решение. Это на самом деле очень легко.

Все, что мне нужно было сделать, это установить какое-то дополнение к Firefox (я использовал Fox, но другие тоже справились бы), чтобы видеть заголовки/пакеты HTTP при выполнении некоторой работы в Livelink. В большинстве случаев операции выполняются методом POST. С помощью плагина Fox я понял, что отправлены 3 POST, 2 сначала вернули ошибку 401, а 3-й вернул правильный ответ 200 и выполнил действие.

Затем я могу сделать вывод, что Livelink — это SOAP-сервис, основанный на аутентификации NTLM. Похоже, он был разработан в ASP.net.

Чтобы использовать веб-сервис в VBA, нет ничего проще. Вам понадобится библиотека Microsoft XML v6.0 для объекта MSXML2, вот и все:

Dim sMsg As String
Dim sURL As String, postData As String
Dim ObjHTTP As Object

Set ObjHTTP = New MSXML2.XMLHTTP
sURL = "http://server.com/livelink/livelink.exe"
postData = "your-post-data"

ObjHTTP.Open "Post", sURL, False
ObjHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
ObjHTTP.send (postData)

Set ObjHTTP = Nothing

Все просто: просто найдите нужные данные POST с помощью какого-нибудь плагина для браузера, и все готово. Большая часть пост-данных не закодирована и с ними легко работать.

person dan    schedule 17.01.2013