如何清除缓存,当您的应用程序承载 Visual C#.net 中的 web 浏览器控件

您可能需要以编程方式清除缓存,当您的应用程序承载 web 浏览器控件。但是,此功能不能通过 web 浏览器控件的接口。

WinInet 函数

若要清除缓存直接,您可以使用以下 WinInet 函数:
  • 使用 FindFirstURLCacheEntry 函数来找到第一个缓存项。
  • 枚举通过缓存使用 FindNextUrlCacheEntry 函数。
  • 若要删除的每个条目使用 DeleteUrlCacheEntry 函数。
这篇文章中的代码示例使用所有这些功能。

注意: 这些函数只是可用的 Microsoft Internet 浏览器 5。因此,您必须包括相应的检查 (包括这篇文章中的代码示例) 以防止出现错误。

清除缓存 Visual C#.net 中的步骤

在 Visual C#.net 中使用 WinInet 函数,以清除所有在缓存中的文件,请按照下列步骤操作:
  1. 启动 Microsoft Visual Studio.net。
  2. 文件 菜单上指向 新建,然后单击 项目
  3. 新建项目 对话框中单击在 项目类型Visual C# 项目,然后单击 模板 下的 控制台应用程序
  4. 将下面的代码添加到 Class1.cs 类:
    View Code
    using System;
    using System.Runtime.InteropServices;

    // Visual C# version of Q326201
    namespace Q326201CS
    {
        
    // Class for deleting the cache.
        class DeleteCache
        {
            
    // For PInvoke: Contains information about an entry in the Internet cache
            [StructLayout(LayoutKind.Explicit, Size=80)]
            
    public struct INTERNET_CACHE_ENTRY_INFOA
            {
                [FieldOffset(
    0)]  public uint dwStructSize;
                [FieldOffset(
    4)]  public IntPtr lpszSourceUrlName;
                [FieldOffset(
    8)]  public IntPtr lpszLocalFileName;
                [FieldOffset(
    12)] public uint CacheEntryType;
                [FieldOffset(
    16)] public uint dwUseCount;
                [FieldOffset(
    20)] public uint dwHitRate;
                [FieldOffset(
    24)] public uint dwSizeLow;
                [FieldOffset(
    28)] public uint dwSizeHigh;
                [FieldOffset(
    32)] public FILETIME LastModifiedTime;
                [FieldOffset(
    40)] public FILETIME ExpireTime;
                [FieldOffset(
    48)] public FILETIME LastAccessTime;
                [FieldOffset(
    56)] public FILETIME LastSyncTime;
                [FieldOffset(
    64)] public IntPtr lpHeaderInfo;
                [FieldOffset(
    68)] public uint dwHeaderInfoSize;
                [FieldOffset(
    72)] public IntPtr lpszFileExtension;
                [FieldOffset(
    76)] public uint dwReserved;
                [FieldOffset(
    76)] public uint dwExemptDelta;
            }

            
    // For PInvoke: Initiates the enumeration of the cache groups in the Internet cache
            [DllImport(@"wininet",
                SetLastError
    =true,
                CharSet
    =CharSet.Auto,
                EntryPoint
    ="FindFirstUrlCacheGroup",
                CallingConvention
    =CallingConvention.StdCall)]
            
    public static extern IntPtr FindFirstUrlCacheGroup(
                
    int dwFlags,
                
    int dwFilter,
                IntPtr lpSearchCondition,
                
    int dwSearchCondition,
                
    ref long lpGroupId,
                IntPtr lpReserved);

            
    // For PInvoke: Retrieves the next cache group in a cache group enumeration
            [DllImport(@"wininet",
                SetLastError
    =true,
                CharSet
    =CharSet.Auto,
                EntryPoint
    ="FindNextUrlCacheGroup",
                CallingConvention
    =CallingConvention.StdCall)]
            
    public static extern bool FindNextUrlCacheGroup(
                IntPtr hFind,
                
    ref long lpGroupId,
                IntPtr lpReserved);

            
    // For PInvoke: Releases the specified GROUPID and any associated state in the cache index file
            [DllImport(@"wininet"
                SetLastError
    =true
                CharSet
    =CharSet.Auto, 
                EntryPoint
    ="DeleteUrlCacheGroup"
                CallingConvention
    =CallingConvention.StdCall)]
            
    public static extern bool DeleteUrlCacheGroup(
                
    long GroupId,
                
    int dwFlags,
                IntPtr lpReserved);

            
    // For PInvoke: Begins the enumeration of the Internet cache
            [DllImport(@"wininet",
                SetLastError
    =true,
                CharSet
    =CharSet.Auto,
                EntryPoint
    ="FindFirstUrlCacheEntryA",
                CallingConvention
    =CallingConvention.StdCall)]
            
    public static extern IntPtr FindFirstUrlCacheEntry(
                [MarshalAs(UnmanagedType.LPTStr)] 
    string lpszUrlSearchPattern,
                IntPtr lpFirstCacheEntryInfo,
                
    ref int lpdwFirstCacheEntryInfoBufferSize);

            
    // For PInvoke: Retrieves the next entry in the Internet cache
            [DllImport(@"wininet",
                SetLastError
    =true,
                CharSet
    =CharSet.Auto,
                EntryPoint
    ="FindNextUrlCacheEntryA",
                CallingConvention
    =CallingConvention.StdCall)]
            
    public static extern bool FindNextUrlCacheEntry(
                IntPtr hFind,
                IntPtr lpNextCacheEntryInfo,
                
    ref int lpdwNextCacheEntryInfoBufferSize);

            
    // For PInvoke: Removes the file that is associated with the source name from the cache, if the file exists
            [DllImport(@"wininet",
                SetLastError
    =true,
                CharSet
    =CharSet.Auto,
                EntryPoint
    ="DeleteUrlCacheEntryA",
                CallingConvention
    =CallingConvention.StdCall)]
            
    public static extern bool DeleteUrlCacheEntry(
                IntPtr lpszUrlName);

            [STAThread]
            
    static void Main(string[] args)
            {
                
    // Indicates that all of the cache groups in the user's system should be enumerated
                const int CACHEGROUP_SEARCH_ALL = 0x0;
                
    // Indicates that all the cache entries that are associated with the cache group
                
    // should be deleted, unless the entry belongs to another cache group.
                const int CACHEGROUP_FLAG_FLUSHURL_ONDELETE = 0x2;
                
    // File not found.
                const int ERROR_FILE_NOT_FOUND = 0x2;
                
    // No more items have been found.
                const int ERROR_NO_MORE_ITEMS = 259;
                
    // Pointer to a GROUPID variable
                long groupId = 0;

                
    // Local variables
                int cacheEntryInfoBufferSizeInitial = 0;
                
    int cacheEntryInfoBufferSize = 0;
                IntPtr cacheEntryInfoBuffer 
    = IntPtr.Zero;
                INTERNET_CACHE_ENTRY_INFOA internetCacheEntry;
                IntPtr enumHandle 
    = IntPtr.Zero;
                
    bool returnValue = false;

                
    // Delete the groups first.
                
    // Groups may not always exist on the system.
                
    // For more information, visit the following Microsoft Web site:
                
    // http://msdn.microsoft.com/library/?url=/workshop/networking/wininet/overview/cache.asp            
                
    // By default, a URL does not belong to any group. Therefore, that cache may become
                
    // empty even when the CacheGroup APIs are not used because the existing URL does not belong to any group.            
                enumHandle = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL, IntPtr.Zero, 0ref groupId, IntPtr.Zero);
                
    // If there are no items in the Cache, you are finished.
                if (enumHandle != IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
                    
    return;

                
    // Loop through Cache Group, and then delete entries.
                while(true)
                {
                    
    // Delete a particular Cache Group.
                    returnValue = DeleteUrlCacheGroup(groupId, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, IntPtr.Zero);
                    
    if (!returnValue && ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error())
                    {    
                        returnValue 
    = FindNextUrlCacheGroup(enumHandle, ref groupId, IntPtr.Zero);
                    }

                    
    if (!returnValue && (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()))
                        
    break;
                }

                
    // Start to delete URLs that do not belong to any group.
                enumHandle = FindFirstUrlCacheEntry(null, IntPtr.Zero, ref cacheEntryInfoBufferSizeInitial);
                
    if (enumHandle == IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
                    
    return;

                cacheEntryInfoBufferSize 
    = cacheEntryInfoBufferSizeInitial;
                cacheEntryInfoBuffer 
    = Marshal.AllocHGlobal(cacheEntryInfoBufferSize);
                enumHandle 
    = FindFirstUrlCacheEntry(null, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);

                
    while(true)
                {
                    internetCacheEntry 
    = (INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(cacheEntryInfoBuffer, typeof(INTERNET_CACHE_ENTRY_INFOA));        

                    cacheEntryInfoBufferSizeInitial 
    = cacheEntryInfoBufferSize;
                    returnValue 
    = DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);                
                    
    if (!returnValue)
                    {    
                        returnValue 
    = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);
                    }
                    
    if (!returnValue && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
                    {
                        
    break;
                    }            
                    
    if (!returnValue && cacheEntryInfoBufferSizeInitial > cacheEntryInfoBufferSize)
                    {
                        cacheEntryInfoBufferSize 
    = cacheEntryInfoBufferSizeInitial;
                        cacheEntryInfoBuffer 
    = Marshal.ReAllocHGlobal(cacheEntryInfoBuffer, (IntPtr) cacheEntryInfoBufferSize);
                        returnValue 
    = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);                    
                    }
                }
                Marshal.FreeHGlobal(cacheEntryInfoBuffer);        
            }
        }
    }
    1. 编译并运行该项目。
    2. 要确认已删除 Internet 临时文件缓存中的,请按照 Microsoft Internet Explorer 中的下列步骤操作:
    3. 工具 菜单上单击 Internet 选项
    4. 常规 选项卡上 临时 Internet 文件 区域中单击 设置
    5. 单击 查看文件。请注意所有 Internet Explorer 高速缓存中的文件已被删除。
 

posted on 2011-07-20 14:24  飞舞的蒲公英  阅读(1234)  评论(0)    收藏  举报