2012年11月24日星期六

FindFirstUrlCacheEntryEx.Cpp


/*
本文摘自:Microsoft SDKs\Windows\v7.1\Samples\web\Wininet\CacheEnumerate工程。
还有GetUrlCacheEntryInfo,FindFirstUrlCacheGroup,DeleteUrlCacheGroup,FindNextUrlCacheGroup等函数的用法,以后补上。
*/

#include <windows.h>

#include <Wininet.h>
#pragma comment(lib, "Wininet.lib")

VOID EnumerateCache(wchar_t * szUrlSearchPattern)
{  
    //这个函数有所改动,但大的结构没有改变。
   
    DWORD dwErr             = 0;
    DWORD cbCacheInfoSize   = 0;
    LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo = NULL;

    HANDLE hEnum  = NULL;
    hEnum = FindFirstUrlCacheEntryEx(szUrlSearchPattern, 0, URLCACHE_FIND_DEFAULT_FILTER, 0, NULL, &cbCacheInfoSize, NULL, NULL, NULL);
    if (!hEnum)
    {
        dwErr = GetLastError();
        switch (dwErr)
        {          
        case ERROR_NO_MORE_ITEMS:
            wprintf(L"There are no more entries.\n");//没有东西,这很少发生。
            goto cleanup;          
        case ERROR_INSUFFICIENT_BUFFER:
            lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO)  malloc(cbCacheInfoSize);        
            if (!lpCacheEntryInfo)   {
                goto cleanup;
            }          
            ZeroMemory(lpCacheEntryInfo, sizeof(INTERNET_CACHE_ENTRY_INFO));// zero memory the structure
            lpCacheEntryInfo->dwStructSize = cbCacheInfoSize;
            break;          
        default://其他的默认都为失败处理。
            goto cleanup;
        }
    }

    hEnum = FindFirstUrlCacheEntryEx(szUrlSearchPattern, 0, URLCACHE_FIND_DEFAULT_FILTER, 0, lpCacheEntryInfo, &cbCacheInfoSize, NULL, NULL, NULL);
    if (!hEnum)   {
        goto cleanup;
    }
 
    BOOL bDone = FALSE;
    do
    {
        if (lpCacheEntryInfo->lpszSourceUrlName)
        {
            wprintf(L"URL is: %s\n\r", lpCacheEntryInfo->lpszSourceUrlName); //The cache entry's source

            if (lpCacheEntryInfo->lpszLocalFileName)
            {
                wprintf(L"file is: %s\n\r", lpCacheEntryInfo->lpszLocalFileName);          
            }
            else
            {
                wprintf(L"file is:not found\n");
            }

            //还有更多的内容可现实,类型,上次修改时间,过期时间,上次访问时间,结果,大小等。

            wprintf(L"\n");
        }    

        BOOL bRet  = FALSE;
        bRet = FindNextUrlCacheEntryEx(hEnum, lpCacheEntryInfo, &cbCacheInfoSize, NULL, NULL, NULL);
        if (!bRet)
        {
            dwErr = GetLastError();
            switch (dwErr)
            {
            case ERROR_NO_MORE_ITEMS:              
                wprintf(L"There are no more entries.\n"); //结束。
                bDone = TRUE;
                break;
            case ERROR_INSUFFICIENT_BUFFER:              
                free(lpCacheEntryInfo);
                lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO) malloc(cbCacheInfoSize);              
                if (!lpCacheEntryInfo)   {
                    goto cleanup;
                }              
                ZeroMemory(lpCacheEntryInfo, sizeof(INTERNET_CACHE_ENTRY_INFO));
                lpCacheEntryInfo->dwStructSize = cbCacheInfoSize;
                continue;              
            default:
                goto cleanup;
            }
        }
    }
    while (!bDone);

cleanup:  
    if (lpCacheEntryInfo)    {
        free(lpCacheEntryInfo);
    }
   
    if (hEnum)    {
        FindCloseUrlCache(hEnum);
    }
}

int  main( int  argc,  char *  argv[])
{
    //这个包含全部。
    EnumerateCache(0);

    wprintf(L"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
    wprintf(L"\n");

    //这个只包含:visited
    EnumerateCache(L"visited:");//这个可能在内存中,没有对应的文件。

    wprintf(L"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
    wprintf(L"\n");

    //这个只包含:cookie
    EnumerateCache(L"cookie:" );
   
    wprintf(L"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
    wprintf(L"\n");

    //这个除了visited和cookie的剩下来的,都包含。空的应该也不会包含。
    EnumerateCache(L"");

    return   0 ;
}

没有评论:

发表评论