ADODB Stream设为Nothing时缓存未清除的VBA问题求助
解决VBA中XMLHTTP下载文件时的缓存问题
首先得明确:你遇到的问题不是因为没正确把变量设为Nothing——哪怕你补上Set HttpReq = Nothing,也解决不了缓存问题。Set ... = Nothing只是释放对象占用的内存,而你碰到的是Microsoft.XMLHTTP默认的HTTP缓存机制在搞鬼,和对象内存释放完全无关。
问题根源
Microsoft.XMLHTTP会默认启用请求缓存:当你重复请求同一个URL时,它会直接返回本地缓存的旧内容,而不会重新向服务器获取更新后的文件。这就是为什么服务器上的文件已经更新,你下载到的还是旧版本。
具体解决方案
这里有几个可靠的办法绕过缓存,获取最新文件:
方法1:添加禁用缓存的HTTP请求头
在HttpReq.Open之后、HttpReq.send之前,添加强制服务器返回最新内容的请求头:
Dim sFo As String Dim oStrm As Object Dim HttpReq As Object Dim nwLBUDir As String sFo = "http://10.38.111.342/Shared_Docs//Docs/Locfile.mdb" nwLBUDir = Application.CurrentProject.Path Set HttpReq = CreateObject("microsoft.XMLHTTP") HttpReq.Open "GET", sFo, False ' 新增:添加禁用缓存的请求头 HttpReq.setRequestHeader "Cache-Control", "no-cache, no-store, must-revalidate" HttpReq.setRequestHeader "Pragma", "no-cache" HttpReq.setRequestHeader "Expires", "0" HttpReq.send If HttpReq.Status = 200 Then Set oStrm = CreateObject("ADODB.Stream") oStrm.Open oStrm.Type = 1 oStrm.Write HttpReq.responseBody oStrm.SaveToFile nwLBUDir & "\" & "Locfile.mdb", 2 oStrm.Close End If ' 别忘了释放所有对象 Set oStrm = Nothing Set HttpReq = Nothing
方法2:给URL添加随机参数
在URL末尾拼接一个每次都不一样的随机值(比如时间戳),让每次请求的URL看起来是新的,这样缓存就不会生效:
' 修改sFo的定义,添加随机参数 sFo = "http://10.38.111.342/Shared_Docs//Docs/Locfile.mdb?rnd=" & Timer
Timer函数会返回当前时间的秒数,每次运行都不同,服务器会忽略这个无用参数,但会返回最新的文件内容。
方法3:改用WinHttpRequest对象
WinHttpRequest对缓存的控制更直接,你可以直接禁用它的缓存功能:
' 替换创建对象的代码 Set HttpReq = CreateObject("WinHttp.WinHttpRequest.5.1") HttpReq.Open "GET", sFo, False ' 直接禁用缓存 HttpReq.Option(6) = False ' WinHttpRequestOption_EnableHttpCache HttpReq.send
补充提醒
你之前的代码里漏了Set HttpReq = Nothing,不过即使补上也解决不了缓存问题。记住:释放对象只是清理内存,影响不到系统或浏览器级的HTTP缓存,核心还是要从HTTP请求本身入手,强制跳过缓存获取最新文件。
内容的提问来源于stack exchange,提问作者KGB




