URLDownloadToFile异常:文件下载至缓存而非指定路径求助
解决URLDownloadToFile下载到IE缓存而非指定路径的问题
看起来你遇到的核心问题有两个:一是目标路径只指定了文件夹,没有包含具体的文件名,二是IE的缓存机制可能导致函数直接读取缓存而非写入你指定的位置。咱们一步步来修复:
1. 确保目标路径是完整的文件路径
你的代码最后一行只传了strDest(文件夹路径)给URLDownloadToFile的第三个参数,但这个参数要求的是完整的文件路径(文件夹+文件名),不能只传文件夹。
你已经获取了pdf_filename,只需要把它和strDest拼接起来,注意处理路径末尾的斜杠:
' 确保路径末尾有反斜杠,避免拼接出错 If Right(strDest, 1) <> "\" Then strDest = strDest & "\" End If ' 拼接完整的目标文件路径 Dim fullDestPath As String fullDestPath = strDest & pdf_filename
然后修改URLDownloadToFile的调用,同时添加结果检查:
Dim downloadResult As Long downloadResult = URLDownloadToFile(0, pdf_path_URL, fullDestPath, 0, 0) ' 0表示下载成功,其他值对应错误码 If downloadResult <> 0 Then MsgBox "下载失败,错误码:" & downloadResult, vbExclamation wb.Range("b" & i).Value = "下载失败" Else wb.Range("b" & i).Value = "已下载" End If
2. 禁用缓存强制重新下载
如果还是出现缓存优先的问题,可以给URLDownloadToFile添加禁用缓存的标志,需要先补充常量定义:
' 新增缓存控制常量 Private Const BIND_FPR_DOWNLOAD As Long = &H10 Private Const FLAG_FORMS_NO_CACHE As Long = &H4000000 ' 保留原有的函数声明 Private Declare Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" ( _ ByVal pCaller As Long, _ ByVal szURL As String, _ ByVal szFileName As String, _ ByVal dwReserved As Long, _ ByVal lpfnCB As Long _ ) As Long
调用时传入这些标志,强制绕过缓存:
downloadResult = URLDownloadToFile(0, pdf_path_URL, fullDestPath, BIND_FPR_DOWNLOAD Or FLAG_FORMS_NO_CACHE, 0)
3. 整合到你的代码中的完整修改
把这些修改替换掉你原来的URLDownloadToFile调用部分:
' ... 你的原有代码 ... pdf_filename = Trim(IE.document.frames.Item(2).document.getElementById("tab_NavigationbarComponent_openItemTab_" & i1 & "_0").innerText) ' --- 新增修改部分 --- ' 处理目标路径格式 If Right(strDest, 1) <> "\" Then strDest = strDest & "\" End If Dim fullDestPath As String fullDestPath = strDest & pdf_filename ' 执行下载并检查结果 Dim downloadResult As Long downloadResult = URLDownloadToFile(0, pdf_path_URL, fullDestPath, BIND_FPR_DOWNLOAD Or FLAG_FORMS_NO_CACHE, 0) If downloadResult = 0 Then wb.Range("b" & i).Value = "已下载" Else wb.Range("b" & i).Value = "下载失败,错误码:" & downloadResult End If ' --- 修改结束 ---
为什么会默认到缓存目录?
当你只传文件夹路径给URLDownloadToFile时,函数无法确定具体的输出文件名,会默认使用URL中的文件名并保存到IE缓存目录作为 fallback;另外,如果目标路径的文件已存在,或者URL带有缓存标记,函数会优先读取缓存内容,而不是重新写入你指定的路径。
内容的提问来源于stack exchange,提问作者Thanis Albert
相关产品推荐
相关产品推荐

