注册 登录
编程论坛 VFP论坛

如何定向清除FTP下载文件后的缓存数据?

hxy8000 发布于 2022-05-07 10:58, 2438 次点击
如何定向清除下载FTP文件后的缓存数据?
在客户端下载FTP的一个文件后,即使此后FTP中的该文件内容发生了更新,但客户端再次下载该文件,文件内容依然没有更新。经查,是IE缓存的原因。
手动解决办法:将客户端的IE历史浏览记录手动清除,再重新下载该文件,内容已经更新。
求助VFP程序实现:客户端下载FTP的一个文件后,在客户端定向清除这个IE缓存文件。
12 回复
#2
吹水佬2022-05-07 16:56
试试 Windows API DeleteUrlCacheEntry()
#3
hxy80002022-05-08 10:06
lcRemoteUrl="地址"
Declare Integer DeleteUrlCacheEntry In Wininet.Dll String szUrl,String szFileName,Integer dwReserved,Integer lpfnCB
=DeleteUrlCacheEntry(lcRemoteUrl) &&清理缓存

请教“地址”填写什么内容?
#4
hxy80002022-05-08 14:36
以下是引用吹水佬在2022-5-7 16:56:10的发言:

试试 Windows API DeleteUrlCacheEntry()

这条语句还是不能将客户端的下载文件缓存数据清除!

请问:有没有更直接一点的语句?可以先找到这个缓存文件夹(“C:\Users\用户名\AppData\Local\Microsoft\Windows\INetCache”手动可以查到该文件夹,代码怎样获取客户端的这个文件夹?可能因操作系统不同或用户修改原因而造成该文件夹路径或名称不同),再删除该缓存文件夹下的下载缓存文件。
#5
csyx2022-05-08 20:32
程序代码:
Declare Long SHGetSpecialFolderPath in shell32 Long, String @, Long, Long
cPath = Replicate(Chr(0), 512)
If SHGetSpecialFolderPath(0, @ cPath, 32, 0) != 0
    ? Rtrim(cPath, Chr(0))
EndIf

#6
hxy80002022-05-09 01:37
以下是引用csyx在2022-5-8 20:32:12的发言:

Declare Long SHGetSpecialFolderPath in shell32 Long, String @, Long, Long
cPath = Replicate(Chr(0), 512)
If SHGetSpecialFolderPath(0, @ cPath, 32, 0) != 0
    ? Rtrim(cPath, Chr(0))
EndIf

非常感谢!通过以上代码,可以找到IE缓存文件夹了。但是,此文件夹内的缓存文件明明可以看到,也可手工删除,就是FILE()函数不能找到该文件,DELETE FILE 命令也无法删除该文件。真是奇怪!请问这是为何?
本人知道该缓存文件夹下还有下级目录及该缓存文件IE\ABC\**.**,但更是无法捕捉到"ABC"文件夹的名称,因为每次下载相同文件,该"ABC"文件夹的名称总是随机变化.
求助,即时删除从FTP下载文件后的IE缓存文件!
#7
csyx2022-05-09 03:16
那就简单的调用Windows让它自己去清除
Declare Long ShellExecute in shell32 Long, String, String, String, String, Long
ShellExecute(0, "open", "rundll32.exe", " InetCpl.cpl,ClearMyTracksByProcess 8", "", 0)

你可以把上面的8改为任何你希望清除的类别,完整的选项定义(可以组合):
// This magic value is the combination of the following bitflags:
// #define CLEAR_HISTORY         0x0001 // Clears history
// #define CLEAR_COOKIES         0x0002 // Clears cookies
// #define CLEAR_CACHE           0x0004 // Clears Temporary Internet Files folder
// #define CLEAR_CACHE_ALL       0x0008 // Clears offline favorites and download history
// #define CLEAR_FORM_DATA       0x0010 // Clears saved form data for form auto-fill-in
// #define CLEAR_PASSWORDS       0x0020 // Clears passwords saved for websites
// #define CLEAR_PHISHING_FILTER 0x0040 // Clears phishing filter data
// #define CLEAR_RECOVERY_DATA   0x0080 // Clears webpage recovery data
// #define CLEAR_PRIVACY_ADVISOR 0x0800 // Clears tracking data
// #define CLEAR_SHOW_NO_GUI     0x0100 // Do not show a GUI when running the cache clearing
//
// Bitflags available but not used in this magic value are as follows:
// #define CLEAR_USE_NO_THREAD      0x0200 // Do not use multithreading for deletion
// #define CLEAR_PRIVATE_CACHE      0x0400 // Valid only when browser is in private browsing mode
// #define CLEAR_DELETE_ALL         0x1000 // Deletes data stored by add-ons
// #define CLEAR_PRESERVE_FAVORITES 0x2000 // Preserves cached data for "favorite" websites


[此贴子已经被作者于2022-5-9 03:29编辑过]

#8
schtg2022-05-09 05:41
回复 7楼 csyx
学习啦,谢谢!
#9
hxy80002022-05-09 10:24
该论坛有高手!高手又很热心助人!
非常感谢七楼csyx的帮助,您提供的代码基本可以解决我的问题(清除系统缓存数据,确保用户每次下载的文件是最新的文件,而不是可能的缓存旧文件)
顺附:*!*    ClearMyTracksByProcess函数 与IE缓存相关的参数详解:
*!*    //Temporary Internet Files  (删除Internet临时文件)  
*!*    //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8  
*!*    //Cookies (删除cookie)  
*!*    //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2  
*!*    //History (删除历史记录)  
*!*    //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1  
*!*    //Form Data (删除表单数据)  
*!*    //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16  
*!*    //Passwords (删除密码)  
*!*    //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32  
*!*    //Delete All  (全部删除)  
*!*    //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255  
*!*    //Delete All (全部删除,包括插件的设置和文件)  
*!*    //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351  

虽然上述代码能达到基本使用要求,但还有一点点遗憾:如果能定向清除某一缓存文件就更佳,因为不愿因自己的软件需要而擅自清除客户端的所有缓存文件,以免影响用户可能需要他缓存文件的体验。
再次谢谢csyx及版主等!
#10
csyx2022-05-09 21:03
定向应该也是可以的,相关的api有GetUrlCacheEntryInfo,FindFirstURLCacheEntry,FindNextUrlCacheEntry,再配合吹版说的DeleteUrlCacheEntry,应该可以实现你的需求
这里说的定向是指某一网站或URL
前三个api都涉及结构体,我对vfp怎么传送结构体不熟,这个你得向吹版请教

[此贴子已经被作者于2022-5-10 07:27编辑过]

#11
hxy80002022-05-10 09:38
好的!欢迎各位继续赐教
#12
laowan0012022-05-10 10:53
用吹版提示的DeleteUrlCacheEntry就可以,在下载后执行DeleteUrlCacheEntry,取到的就是新文件
IE的缓存是自动管理的,通常没必要人工去干预
#13
hxy80002022-05-11 12:58
在VFP中,是否可在URL结尾外加个随机数,这样缓存中的URL就会不同,下载的相同文件就指向不同的URL,系统就会重新URL取新的文件了。如果可以,但不知怎么添加随机数。URL?A=**,好像也不能实现。
1