在WPF中使用C#代码删除IE缓存和Cookie

我在我的WPF应用程序中使用WebBrowser控件,我希望从代码中清除IE cookie缓存。

我试图使用以下代码

string[] Cookies = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Cookies)); foreach (string currentFile in Cookies) { try { System.IO.File.Delete(currentFile); } catch (Exception ex) { MessageBox.Show(ex.Message); } } 

这会从指定的文件夹中删除文件,但是当我使用WebBrowser控件向后导航时,cookie会重新出现,就像它们从未被删除一样。

这可能是正确的结果,因为我假设Environment.SpecialFolder.Cookies文件夹位于AppData中,该文件夹是用户最多的当前快照。

如果我打开IE,并对cookie和缓存进行硬删除,我会在我的应用程序中获得预期的输出。

有没有办法在代码中执行此操作?

Microsoft KB文章将帮助您更好地清除整个缓存。

链接参考

但是,您也可以尝试以下解决方案。

 string[] InterNetCache = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache)); 

使用以下function可以删除特定主机名的cookie。 如果需要清除整个缓存,则应删除条件“ if(sourceUrlName.Contains(hostEntry)&& sourceUrlName.ToLower()。Contains(”cookie“)) ”。

  ///  /// Internets the set cookie. ///  /// Name of the LPSZ URL. /// Name of the LPSZ cookie. /// The LPSZ cookie data. /// true if XXXX, false otherwise [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool InternetSetCookie(string lpszUrlName, string lpszCookieName, string lpszCookieData); ///  /// Internets the get cookie. ///  /// The LPSZ URL. /// Name of the LPSZ cookie. /// The LPSZ cookie data. /// Size of the LPDW. /// true if XXXX, false otherwise [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool InternetGetCookie(string lpszUrl, string lpszCookieName, StringBuilder lpszCookieData, ref int lpdwSize); ///  /// Finds the first URL cache entry. ///  /// The LPSZ URL search pattern. /// The lp first cache entry info. /// Size of the LPDW first cache entry info buffer. /// IntPtr. [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); ///  /// Finds the next URL cache entry. ///  /// The h find. /// The lp next cache entry info. /// Size of the LPDW next cache entry info buffer. /// true if XXXX, false otherwise [DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "FindNextUrlCacheEntryA", CallingConvention = CallingConvention.StdCall)] public static extern bool FindNextUrlCacheEntry( IntPtr hFind, IntPtr lpNextCacheEntryInfo, ref int lpdwNextCacheEntryInfoBufferSize); ///  /// Deletes the URL cache entry. ///  /// Name of the LPSZ URL. /// true if XXXX, false otherwise [DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "DeleteUrlCacheEntryA", CallingConvention = CallingConvention.StdCall)] public static extern bool DeleteUrlCacheEntry( IntPtr lpszUrlName); ///  /// Clears the IE cache. ///  /// The URL. public static void ClearIECache(string url) { try { // No more items have been found. const int ERROR_NO_MORE_ITEMS = 259; string hostEntry = new Uri(url).Host; // Local variables int cacheEntryInfoBufferSizeInitial = 0; int cacheEntryInfoBufferSize = 0; IntPtr cacheEntryInfoBuffer = IntPtr.Zero; INTERNET_CACHE_ENTRY_INFOA internetCacheEntry; IntPtr enumHandle = IntPtr.Zero; bool returnValue = false; // 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)); string sourceUrlName = Marshal.PtrToStringAnsi(internetCacheEntry.lpszSourceUrlName); cacheEntryInfoBufferSizeInitial = cacheEntryInfoBufferSize; if (sourceUrlName.Contains(hostEntry) && sourceUrlName.ToLower().Contains("cookie")) { DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName); } 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); } catch { //error } } ///  /// Struct INTERNET_CACHE_ENTRY_INFOA ///  [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 System.Runtime.InteropServices.ComTypes.FILETIME LastModifiedTime; [FieldOffset(40)] public System.Runtime.InteropServices.ComTypes.FILETIME ExpireTime; [FieldOffset(48)] public System.Runtime.InteropServices.ComTypes.FILETIME LastAccessTime; [FieldOffset(56)] public System.Runtime.InteropServices.ComTypes.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; }