Home mail me! Syndicate this site using RSS

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;
}

Leave a Comment

*
To prove that you're not a bot, enter this code
Anti-Spam Image