0

我已经在使用以下代码将文件复制到 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。

谢谢你。

4

2 回答 2

0

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

如果您想在 LiveLink 中反映结构,那么您必须探索文件夹树来复制内容 - 但是有大量的 vba 代码可以循环遍历文件和文件夹树,如果您必须,它都可以调用您的 saveFileLL 函数走那条路。

于 2013-01-15T18:39:02.977 回答
0

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

我所要做的就是在 Firefox 中安装一些附加组件(我使用 Fox,但其他人也会这样做),以便在 Livelink 中执行某些工作时查看 HTTP 标头/数据包。大多数时候,操作是通过 POST 方法完成的。我意识到使用 Fox 插件发送了 3 个 POST,第 2 个首先返回 401 错误,而第 3 个返回正确的 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 数据即可。大多数后期数据未编码且易于处理。

于 2013-01-17T15:33:37.323 回答