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

文章翻译 文章翻译
文章编号: 326201 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本分步指南介绍了如何使用 WinInet 应用程序编程接口 (API) 函数直接清除缓存。

您可能需要以编程方式清除缓存,当您的应用程序承载 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 类:
    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, 0, ref 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);		
            }
        }
    }
    					
  5. 编译并运行该项目。
  6. 要确认已删除 Internet 临时文件缓存中的,请按照 Microsoft Internet Explorer 中的下列步骤操作:
    1. 工具 菜单上单击 Internet 选项
    2. 常规 选项卡上 临时 Internet 文件 区域中单击 设置
    3. 单击 查看文件。请注意所有 Internet Explorer 高速缓存中的文件已被删除。

参考

这篇文章中的代码示例使用 互操作 命名空间的一部分的 Visual Studio.net 运行库。有关详细的信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
与非托管代码交互操作
http://msdn2.microsoft.com/en-us/library/sd10k43k(vs.71).aspx
有关 Microsoft.net 开发的信息,请访问下面的 MSDN 网站:
.NET 框架开发人员中心
http://msdn2.microsoft.com/en-us/netframework/default.aspx
有关语法的更多信息,WinInet 缓存的函数,请访问下面的 MSDN 网站:
WinInet 缓存
http://msdn2.microsoft.com/en-us/library/ms965968.aspx
有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
262110如何清除缓存,当您的应用程序承载 web 浏览器控件
有关为 Microsoft Internet Explorer 中开发的基于 Web 的解决方案的详细信息请访问以下 Microsoft 网站:
http://msdn.microsoft.com/ie/

http://support.microsoft.com/iep

属性

文章编号: 326201 - 最后修改: 2009年3月13日 - 修订: 4.0
这篇文章中的信息适用于:
  • Microsoft Visual C# .NET 2002 标准版
关键字:?
kbmt kbcaching kbcominterop kbhowto kbhowtomaster kbwebbrowser kbwininet KB326201 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 326201
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com