用 C# 获取 IE 临时文件

大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到Internet临时文件夹中。
我们可以通过

  1<drives>:\Documents and Settings\<user>\Local Settings\Temporary Internet Files访问。但是可能我们都没有想到,里面的文件实际却不同于我们系统中其他的文件夹和文件的关系。 
  2
  3举例说明,我们在VS.net下写一个函数来返回指定文件夹中的文件夹和所有文件时,但我们把Internet临时文件夹的地址传进去时,系统只会返回一个文件,那就是desktop.ini(每个文件夹都有),还有一个隐藏的文件夹。所以这就证明了在临时文件夹中的文件并不是按照普通的文件夹与文件的方式存在的。 
  4
  5其实windows是把临时文件全部存在一个隐藏的文件夹中,这个文件夹是我们都看不到的,然后靠一个index.dat的索引把内容全部读出来回显给用户。 
  6
  7那我们怎么用程序来读取其中的内容呢? 因为这几天在帮同学完成他的毕业设计,所以研究了一下。   
  8首先要引用一个user.dll,在系统文件夹中。然后利用它其中的一些函数就可以遍历整个文件夹,并获得其中每个文件的信息。 
  9
 10[DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]   
 11public static extern IntPtr FindFirstUrlCacheEntry(   
 12[MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,   
 13IntPtr lpFirstCacheEntryInfo,   
 14ref int lpdwFirstCacheEntryInfoBufferSize); 
 15
 16[DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]   
 17public static extern bool FindNextUrlCacheEntry(   
 18IntPtr hEnumHandle,   
 19IntPtr lpNextCacheEntryInfo,   
 20ref int lpdwNextCacheEntryInfoBufferSize); 
 21
 22[DllImport("wininet.dll")]   
 23public static extern bool FindCloseUrlCache(   
 24IntPtr hEnumHandle);   
 25
 26
 27引入以上三个函数来遍历临时文件夹,然后再引用 
 28
 29[DllImport("kernel32.dll",SetLastError=true, CharSet=CharSet.Auto)]   
 30public static extern int FileTimeToSystemTime(   
 31IntPtr lpFileTime,   
 32IntPtr lpSystemTime); 
 33
 34用来把 FileTime时间格式转化成c#中的string类型,以便我们进一步操作。 
 35
 36主体程序如下: 
 37
 38#region 引入dll 
 39
 40[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]   
 41public struct INTERNET_CACHE_ENTRY_INFO   
 42{   
 43public int dwStructSize;   
 44public IntPtr lpszSourceUrlName;   
 45public IntPtr lpszLocalFileName;   
 46public int CacheEntryType;   
 47public int dwUseCount;   
 48public int dwHitRate;   
 49public int dwSizeLow;   
 50public int dwSizeHigh;   
 51public FILETIME LastModifiedTime;   
 52public FILETIME ExpireTime;   
 53public FILETIME LastAccessTime;   
 54public FILETIME LastSyncTime;   
 55public IntPtr lpHeaderInfo;   
 56public int dwHeaderInfoSize;   
 57public IntPtr lpszFileExtension;   
 58public int dwExemptDelta;   
 59} 
 60
 61[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]   
 62public struct SYSTEMTIME   
 63{   
 64public short wYear;   
 65public short wMonth;   
 66public short wDayOfWeek;   
 67public short wDay;   
 68public short wHour;   
 69public short wMinute;   
 70public short wSecond;   
 71public short wMilliseconds;   
 72} 
 73
 74[DllImport("kernel32.dll",SetLastError=true, CharSet=CharSet.Auto)]   
 75public static extern int FileTimeToSystemTime(   
 76IntPtr lpFileTime,   
 77IntPtr lpSystemTime); 
 78
 79[DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]   
 80public static extern IntPtr FindFirstUrlCacheEntry(   
 81[MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,   
 82IntPtr lpFirstCacheEntryInfo,   
 83ref int lpdwFirstCacheEntryInfoBufferSize); 
 84
 85[DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]   
 86public static extern bool FindNextUrlCacheEntry(   
 87IntPtr hEnumHandle,   
 88IntPtr lpNextCacheEntryInfo,   
 89ref int lpdwNextCacheEntryInfoBufferSize); 
 90
 91[DllImport("wininet.dll")]   
 92public static extern bool FindCloseUrlCache(   
 93IntPtr hEnumHandle); 
 94
 95const int ERROR_NO_MORE_ITEMS = 259; 
 96
 97#endregion 
 98
 99#region FileTimeToSystemTime   
100  
101private string FILETIMEtoDataTime(FILETIME time)   
102{   
103IntPtr filetime = Marshal.AllocHGlobal( Marshal.SizeOf(typeof(FILETIME)) );   
104IntPtr systime = Marshal.AllocHGlobal( Marshal.SizeOf(typeof(SYSTEMTIME)) );   
105Marshal.StructureToPtr(time,filetime,true);   
106FileTimeToSystemTime( filetime ,systime);   
107SYSTEMTIME st = (SYSTEMTIME) Marshal.PtrToStructure(systime,typeof(SYSTEMTIME));   
108string Time = st.wYear.ToString()+"."+st.wMonth.ToString()+"."+st.wDay.ToString()+"."+st.wHour.ToString()+"."+st.wMinute.ToString()+"."+st.wSecond.ToString();   
109return Time;   
110} 
111
112#endregion 
113
114#region 加载数据   
115private void FileOk_Click(object sender, System.EventArgs e)   
116{   
117  
118int nNeeded = 0, nBufSize;   
119IntPtr buf;   
120INTERNET_CACHE_ENTRY_INFO CacheItem;   
121IntPtr hEnum;   
122bool r; 
123
124FindFirstUrlCacheEntry( null, IntPtr.Zero, ref nNeeded ); 
125
126if ( Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS )   
127return; 
128
129nBufSize = nNeeded;   
130buf = Marshal.AllocHGlobal( nBufSize );   
131hEnum = FindFirstUrlCacheEntry( null, buf, ref nNeeded );   
132while ( true )   
133{   
134CacheItem = (INTERNET_CACHE_ENTRY_INFO) Marshal.PtrToStructure( buf,   
135typeof(INTERNET_CACHE_ENTRY_INFO) ); 
136
137string modifiedTime = FILETIMEtoDataTime(CacheItem.LastModifiedTime);   
138string expireTime = FILETIMEtoDataTime(CacheItem.ExpireTime);   
139string accessTime = FILETIMEtoDataTime(CacheItem.LastAccessTime);   
140string syncTime = FILETIMEtoDataTime(CacheItem.LastSyncTime); 
141
142#region 获得数据,存入数据库   
143try   
144{ 
145
146//  **此處遍歷CacheItem即可  
147** //例如   
148string s = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName);   
149}   
150catch   
151{   
152//異常處理   
153}   
154#endregion 
155
156string s = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName); 
157
158nNeeded = nBufSize;   
159r = FindNextUrlCacheEntry( hEnum, buf, ref nNeeded ); 
160
161if ( !r &amp;&amp; Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS )   
162break; 
163
164if ( !r &amp;&amp; nNeeded &gt; nBufSize )   
165{   
166nBufSize = nNeeded;   
167buf = Marshal.ReAllocHGlobal( buf, (IntPtr) nBufSize );   
168FindNextUrlCacheEntry( hEnum, buf, ref nNeeded );   
169}   
170}   
171  
172MessageBox.Show("系统数据加载完毕!");   
173Marshal.FreeHGlobal( buf ); 
174
175} 
176
177#endregion</user></drives>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus