Disable URLDownloadToFile cache
VC++提供了URLDownloadToFile和URLDownloadToCacheFile两个方法用来实现文件的下载,省去了自己写SOCKET。
默认情况下,这两个方法都会从缓存里找,若存在缓存,则会直接从缓存取,而不再下载(IE就是这么实现的),这样大大增加了下载出错的几率。
下面提供两种方法来禁止缓存,而每次都从服务器端下载
方法一:
该方法最简单,在调用URLDownloadToFile之间调用DeleteUrlCacheEntry即可。
DeleteUrlCacheEntry()方法在Wininet.h头文件里定义。
DeleteUrlCacheEntry(remote_file); HRESULT hr = URLDownloadToFile(NULL, local_file, remote_file, 0, 0);
方法二:
这种方法适合需实现自定义下载进度的,原理就是实现一个IBindStatusCallback接口的GetBindInfo方法,加入BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE属性即可。相关代码如下:
STDMETHODIMP CBindStatusCallback::GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindInfo) { if (!pgrfBINDF || !pbindInfo || pgrfBINDF == NULL) { return E_POINTER; } // force redownload *pgrfBINDF |= BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE; if (pbindInfo->cbSize<sizeof(BINDINFO)) { return E_INVALIDARG; } if (pbindInfo->dwBindVerb!=BINDVERB_POST && pbindInfo->dwBindVerb!=BINDVERB_GET) { return E_UNEXPECTED; } return E_NOTIMPL; }

