c# winform清空ie缓存的几种方法

本文对比了三种清除IE浏览器缓存的方法:直接删除缓存文件、调用winnet.dll库函数和使用RunDll32.exe。详细分析了每种方法的实现过程、效率及存在的问题,最终推荐使用RunDll32.exe方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很明显 IE的缓存在其目录中显示的并不是真正的文件所处的位置,文件的位置是在隐藏的文件夹中,而且这个隐藏的文件夹我们一般找不到.在网上几种清空缓存的方法,在此我一一把代码和处理的效果显示出来.供大家参考.

①.使用ie缓存路径来删除缓存的

?
1
2
3
4
5
6
7
8
9
10
11
string  cachePath = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);
//获取缓存路径
DirectoryInfo di =  new  DirectoryInfo(cachePath);
foreach  (FileInfo fi  in  di.GetFiles( "*.*" , SearchOption.AllDirectories)) //遍历所有的文件夹 删除里面的文件
{
   try
   {
    fi.Delete();
   }
   catch  { }
}

效果:并没有真正的删除缓存文件.而且会出现很多异常,比如enguser.dat,index.dat,,,这些文件删除的时候会出现另一个程序还在使用的错误

②.调用winnet.dll 清理缓存 上代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Rntime.InteropServices;
using  System.IO;
namespace  WpfClient.AppCode
{
  public  class  ClearCache
  {
   [StructLayout(LayoutKind.Explicit, Size = 80,CharSet=CharSet.Auto)]
   protected  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)]
   protected  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)]
   protected  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)]
   protected  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)]
   protected  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)]
   protected  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)]
   protected  static  extern  bool  DeleteUrlCacheEntry(
    IntPtr lpszUrlName)
   public  static  void  DelCache(){
    // 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:
    // 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);
     string  s = Marshal.PtrToStringAnsi(internetCacheEntry.lpszLocalFileName);
     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); 
   }
  }
}

效果:总体来说还是有点效果的,但是效率极低,会出现长时间的等待情况,程序假死. 最重要的是不知道什么时候结束.

③.调用RunDll32.exe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
RunCmd( "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8" );
void  RunCmd( string  cmd)
{
  System.Diagnostics.Process p =  new  System.Diagnostics.Process();
  p.StartInfo.FileName =  "cmd.exe" ;
  // 关闭Shell的使用
  p.StartInfo.UseShellExecute =  false ;
  // 重定向标准输入
  p.StartInfo.RedirectStandardInput =  true ;
  // 重定向标准输出
  p.StartInfo.RedirectStandardOutput =  true ;
  //重定向错误输出
  p.StartInfo.RedirectStandardError =  true ;
  p.StartInfo.CreateNoWindow =  true ;
  p.Start();
  p.StandardInput.WriteLine(cmd);
  p.StandardInput.WriteLine( "exit" );
}

效果: 这个方法解决的我的问题,缓存被清空.

以下是其他一些参数的说明:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Temporary Internet Files (Internet临时文件)
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8
//Cookies
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2
//History (历史记录)
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1
//Form Data (表单数据)
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16
//Passwords (密码)
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32
//Delete All (全部删除)
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255
//Delete All - "Also delete files and settings stored by add-ons"
//RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351

转载于:https://www.cnblogs.com/dachuang/p/10406620.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值