本文实例讲述了C#实现清除IE浏览器缓存的方法。分享给大家供大家参考。具体如下:
项目中碰到wpf webbrowser的几个问题,在此记录一下
1.webbrowser中对于jquery的bind事件的处理.
在普通的浏览器下一下这种写法没有任何问题
1
2
3
4
5
6
7
8
|
var
content = $(
"<div><h4><span>"
+ category_name +
"</span>(<a id='href_"
+ guid +
"' href='AddOrEditShowInfo.aspx?Category="
+ guid +
"'>添加展示</a>)"
+
"<span id='edit_"
+ guid +
"' style='font-size:12px;cursor:pointer;' onclick='showCategory(this, \""
+guid+
"\")'>修改分类</span> "
+
"<span id='del_"
+ guid +
"' style='font-size:12px;cursor:pointer;' onclick=delCategory(this, \""
+guid+
"\")'>删除分类</span></h4>"
+
"<table class='gridview' cellspacing='0' rules='all' border='1' id='gvData' width='100%'>"
+
"<thead><tr><th>缩略图</th><th>展示名称</th><th>简介</th><th>详细描述</th><th>操作</th></tr></thead>"
+
"<tbody id='t_"
+ guid +
"' class='css_tbody'></tbody></table></div>"
);
$(
"#vtab"
).append(content);
|
但是在webbrowser中事件就会不响应,把content中的onclick去掉,在下面这样绑定:
1
2
|
$(
"#edit_"
+ guid).unbind(
"click"
).bind(
"click"
,
function
() { showCategory(
this
, guid) });
$(
"#del_"
+ guid).unbind(
"click"
).bind(
"click"
,
function
() { delCategory(
this
,guid)});
|
2.在webbrowser中使用jquery uploadify上传组件的问题
使用该组件的时候 ,发现上传图片的时候 ,第一次上传的时候没有任何问题,第二次上传的时候会出现无法上传的情况,没有任何反应,没有任何错误,上传进度不动,上传的后台代码也不能触发.
解决方案是:清空浏览器缓存就Ok 了.下面就介绍代码清空缓存的方法
3. 清理IE缓存的方法
很明显 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#程序设计有所帮助。