很明显 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

c# winform清空ie缓存的几种方法的更多相关文章

  1. js清除浏览器缓存的几种方法

    2014年9月24日 4692次浏览 关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能.但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数 ...

  2. linux中快速清空文件内容的几种方法

    这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 $ : > filename $ > filename $ echo "" > f ...

  3. C语言清空输入缓冲区的N种方法对比

    转自C语言清空输入缓冲区的N种方法对比 C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int get ...

  4. linux清空文件内容的三种方法

    linux系统中清空文件内容的三种方法 1.使用vi/vim命令打开文件后,输入"%d"清空,后保存即可.但当文件内容较大时,处理较慢,命令如下:vim file_name:%d: ...

  5. winform防止界面卡死的三种方法

    在编程过程中经常会遇到耗时操作,这个时候如果不采取一些必要的异步操作,就会导致界面的卡死,这里以winform为例子,介绍三种方法防止界面卡死,对这几个方法稍加修改同样适用于wpf,silverlig ...

  6. ASP.Net 更新页面输出缓存的几种方法

    ASP.Net 自带的缓存机制对于提高页面性能有至关重要的作用,另一方面,缓存的使用也会造成信息更新的延迟.如何快速更新缓存数据,有时成了困扰程序员的难题.根据我的使用经验,总结了下面几种方法,概括了 ...

  7. iOS清理缓存的几种方法

        - (long long) fileSizeAtPath:(NSString*) filePath{ NSFileManager* manager = [NSFileManager defau ...

  8. iOS 处理缓存的三种方法

    缓存处理是个相当头疼的事情,要根据需要综合应用不同的策略.总的来说有以下几种情况: 1.URL缓存,例如社交应用的帖子浏览,要在viewDidAppear:里面进行URL缓存.简单来说就是用NSURL ...

  9. C语言清空输入缓冲区的N种方法对比【转】

    转自:http://www.cnblogs.com/codingmylife/archive/2010/04/18/1714954.html C语言中有几个基本输入函数: //获取字符系列 int f ...

随机推荐

  1. 刷题48. Rotate Image

    一.题目说明 题目是48. Rotate Image,简而言之就是矩阵顺时针旋转90度.不允许使用额外的矩阵. 经过观察(写一个矩阵,多看几遍就知道了),旋转90度后: 第1行变为len-1列(最后一 ...

  2. 2.7 app的本地化(根据手机的系统进行语言切换)

    首先设计一个基本的界面:系统默认为英文 如图所示: 找到如下路径: res/values/strings/strings.xml 如图所示: 然后点击右上方的open editor 添加需要的字符串如 ...

  3. Android自定义View——QQ音乐中圆形旋转碟子

    1.在onMeasure中测量整个View的宽和高后,设置宽高 2.获取我们res的图片资源后,在ondraw方法中进行绘制圆形图片 3.通过Handler发送Runnable在主线程中更新UI,达到 ...

  4. CNN:转置卷积输出分辨率计算

    上一篇介绍了卷积的输出分辨率计算,现在这一篇就来写下转置卷积的分辨率计算.转置卷积(Transposed convolution),转置卷积也有叫反卷积(deconvolution)或者fractio ...

  5. 解压版mysql安装步骤

    第一步:解压mysql,例如解压后的目录在C:\Program Files\mysql-5.6.36-winx64 第二步:配置mysql环境变量,类似配置java的环境变量 计算机右键===> ...

  6. HDU 2795 Billboard 线段树活用

    题目大意:在h*w 高乘宽这样大小的 board上要贴广告,每个广告的高均为1,wi值就是数据另给,每组数组给了一个board和多个广告,要你求出,每个广告应该贴在board的哪一行,如果实在贴不上, ...

  7. 最长特殊序列 II

    最长特殊序列 II class Solution { boolean containsSub(String s,String p){ int i,j; for(i=0,j=0;i<p.lengt ...

  8. vue项目准备2

    单文件组件与路由 .vue结尾的文件都是单文件组件 路由就是根据网址的不同返回的页面不同 多页应用与单页应用 多页应用: 每次页面跳转,服务器都会返回一个html. 优点:首次展现页面快.搜索引擎排名 ...

  9. Python—程序设计:抽象工厂模式

    抽象工厂模式 内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象. 例:生产一部手机,需要手机壳.CPU.操作系统三类对象进行组装,其中每类对象都有不同的种类.对每个具体工厂,分别生 ...

  10. 18 11 15 网络通信 ---- 多任务----线程 threading

    下面是一个  多线程  运算  调用了 threading  模块   可以同时在一个程序中  跑两个函数 import threading def text1 (): for i in range( ...