Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将文件夹及其子文件夹移动/复制到Livelink_Vba_Ms Access_Livelink - Fatal编程技术网

Vba 将文件夹及其子文件夹移动/复制到Livelink

Vba 将文件夹及其子文件夹移动/复制到Livelink,vba,ms-access,livelink,Vba,Ms Access,Livelink,我已经在使用以下代码将文件复制到Livelink: 公共函数saveFileLL(目标为长,路径源为字符串,文件名为字符串)为布尔值 Dim dav作为新ADODB.记录 将文件设置为新的ADODB.Recordset Dim objStream作为新的ADODB.Stream 将url设置为字符串 如果不是Val(Nz(target,0))>0,或者不是像“*.*”这样的路径源,或者不是像“*.*”这样的文件名,那么 saveFileLL=False 退出功能 如果结束 url=url\u L

我已经在使用以下代码将文件复制到Livelink:

公共函数saveFileLL(目标为长,路径源为字符串,文件名为字符串)为布尔值
Dim dav作为新ADODB.记录
将文件设置为新的ADODB.Recordset
Dim objStream作为新的ADODB.Stream
将url设置为字符串
如果不是Val(Nz(target,0))>0,或者不是像“*.*”这样的路径源,或者不是像“*.*”这样的文件名,那么
saveFileLL=False
退出功能
如果结束
url=url\u LIVELINK\u DAV和target
打开url,adModeReadWrite
Set files=dav.GetChildren
如果不是(files.BOF和files.EOF),则先选择files.MoveFirst
直到files.EOF为止
如果文件名像Replace(files(“RESOURCE\u DISPLAYNAME”)、“”、“?”),则退出Do
files.MoveNext
环
如果是files.EOF,则
files.addnew“RESOURCE_PARSENAME”,文件名
文件。更新
如果结束
文件,关闭
达夫,结束
objStream.Open“URL=”&URL&“/”&fileName,adModeWrite
objStream.Type=adTypeBinary
objStream.LoadFromFile路径源
冲水
objStream,关闭
设置dav=无
设置文件=无
设置objStream=Nothing
saveFileLL=True
端函数
现在,正如标题所说,我想做同样的事情,但有一个文件夹。我想我的问题与Livelink无关,更多的是关于处理文件夹的一般方法。是否可以在不遍历所有子文件夹/文件的情况下移动包含其所有子文件夹的文件夹?如何调整我的
saveFileLL()
函数来执行此操作

编辑:

下面是代码的另一部分,它允许我直接将一个文件夹创建到由objId设计的Livelink文件夹中

公共函数CreateFolderToLLFolder(ObjId为字符串,folderName为字符串,可选getId为Boolean=False)为字符串
将文件作为新的ADODB.Record
将文件作为新的ADODB.Recordset进行调整
Dim davDir作为新的ADODB.Record
变暗newDirFields(1)作为变量
将newdir值(1)变为变量
newDirFields(0)=“资源名称”
newDirValues(0)=folderName
newDirFields(1)=“资源收集”
newDirValues(1)=真
设置davDir=连接(对象为“”)
Set davFiles=davDir.GetChildren()
如果是(davFiles.Supports(adAddNew)),则
davFiles.addnew newDirFields,newDirValues
如果结束
打开davfile,adModeReadWrite
CreateFolderToLLFolder=davfile.fields(“urn:x-opentext-com:ll:properties:nodeid”).value
端函数
公共函数连接(ObjId为字符串,可选文件名为String=“”)为ADODB.Record
Dim davDir作为新的ADODB.Record
打开文件名“URL”=http://livelink-server/livelinkdav/nodes/&ObjId&“/”,adModeReadWrite,adFailIfNotExists,DelayFetchStream,“
设置连接=davDir
端函数
别问我为什么这个有用,我发现了这个,它确实有用。objId是Livelink为其所有文件/文件夹提供的唯一ID


谢谢。

您可以将一整套文件夹及其组成文件/子文件夹压缩保存为一个块,然后上载压缩文件。像这样


如果你想在LiveLink中反映结构,那么你必须浏览文件夹树来复制内容——但是有大量的vba代码在文件和文件夹树中循环,如果你必须这样做的话,它可以调用你的saveFileLL函数。

实现我想要的最简单的方法就是最终使用web服务集成到Livelink中。因为网络上关于整个Livelink API的信息实在不多(考虑到这些天我们在谷歌上能找到的一切,这真是令人惊讶),我愿意在这里发布我的解决方案。这其实很容易

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

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

要在VBA中使用webservice,没有比这更简单的了。MSXML2对象将需要Microsoft XML v6.0 livrary,现在您可以:

Dim sMsg作为字符串
Dim sURL为字符串,postData为字符串
作为对象的Dim ObjHTTP
Set ObjHTTP=New MSXML2.XMLHTTP
苏尔=”http://server.com/livelink/livelink.exe"
postData=“您的postData”
对象打开“Post”,sURL,False
ObjHTTP.setRequestHeader“内容类型”、“应用程序/x-www-form-urlencoded”
ObjHTTP.send(postData)
设置ObjHTTP=Nothing

就这么简单,只要用某种浏览器插件找到正确的帖子数据,你就得到了。大多数post数据都没有编码,也不容易处理。

问题是服务器的ping速度约为1500毫秒。如果我需要循环创建约50个文件夹,则需要50x1.5s,这是很长的时间。而且因为它总是和我需要复制的文件夹结构相同,所以我可以一次性手动压缩它。但我如何将其解压缩到Livelink中呢?情节越来越复杂了!我对LL的了解还不足以说明是否可以在服务器端提取zip。但是,由于延迟似乎非常高,我会打开高分辨率计时器(Win32 API),看看延迟在哪里,这可能会给你一些想法。否则,您是否可以将驱动器映射到LL服务器,这是否更快,或者至少可以在不阻塞线程的情况下工作?这不是更快,但它也可以工作,并且可以帮助在不必手动编程循环的情况下移动完整的文件夹。事实上,它阻碍了这条线索。我也从未听说过VBA中有任何类型的多线程:(我对映射的想法是在临时文件夹中创建一个缓存,它在VBA中会很快,就像在本地存储中一样。然后使用Shell()启动