将带有子项的文件夹移动/复制到Livelink

时间:2013-01-15 17:05:31

标签: vba ms-access 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()函数呢?

修改

以下是另一部分代码,允许我直接在objId设计的Livelink文件夹中创建一个文件夹。

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给他所有文件/文件夹的唯一ID。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将一整套文件夹及其组成文件/子文件夹保存为一个块,然后压缩它们,然后上传zip文件。像这样http://www.rondebruin.nl/windowsxpzip.htm

如果您想在LiveLink中反映结构,那么您必须浏览文件夹树来复制内容 - 但是还有大量的vba代码可以循环访问文件&文件夹树,如果你必须走这条路,它都可以调用你的saveFileLL函数。

答案 1 :(得分:0)

执行我想要的最简单方法是最终使用集成到Livelink中的Web服务。因为网络上关于整个Livelink API的信息确实不多(考虑到我们现在可以在Google上找到的所有信息,这是令人惊讶的),我愿意在这里发布我的解决方案。事实上这很容易。

我所要做的就是在Firefox中安装一些附加组件(我使用Fox但其他人也会这样做),以便在Livelink中进行一些工作时查看HTTP标头/数据包。大多数情况下,操作都是使用POST方法完成的。我意识到Fox插件发送了3个POST,第一个返回401错误,而第三个返回正确的200响应并完成了操作。

然后,我可以推断出Livelink是基于NTLM身份验证的SOAP服务。它看起来像是在ASP.net中开发的。

要在VBA中使用Web服务,没有比这更容易了。您将需要MSXML2对象的Microsoft XML v6.0 livrary,然后你去:

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数据就可以了。大多数后期数据都没有编码,也很容易处理。