在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
http://topic.csdn.net/u/20091102/13/a35034b7-cc18-4aa7-90e3-941604152bb3.html 背景:大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到Internet临时文件夹中。 我们可以通过 <Drives>:\Documents and Settings\<user>\Local Settings\Temporary Internet Files访问。但是可能我们都没有想到,里面的文件实际却不同于我们系统中其他的文件夹和文件的关系。
[DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]
public static extern IntPtr FindFirstUrlCacheEntry( [MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern, IntPtr lpFirstCacheEntryInfo, ref int lpdwFirstCacheEntryInfoBufferSize); [DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)] public static extern bool FindNextUrlCacheEntry( IntPtr hEnumHandle, IntPtr lpNextCacheEntryInfo, ref int lpdwNextCacheEntryInfoBufferSize); [DllImport("wininet.dll")] public static extern bool FindCloseUrlCache( IntPtr hEnumHandle); 引入以上三个函数来遍历临时文件夹,然后再引用 [DllImport("kernel32.dll",SetLastError=true, CharSet=CharSet.Auto)] public static extern int FileTimeToSystemTime( IntPtr lpFileTime, IntPtr lpSystemTime); 用来把 FileTime时间格式转化成c#中的string类型,以便我们进一步操作。 主体程序如下: #region 引入dll [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] public struct INTERNET_CACHE_ENTRY_INFO { public int dwStructSize; public IntPtr lpszSourceUrlName; public IntPtr lpszLocalFileName; public int CacheEntryType; public int dwUseCount; public int dwHitRate; public int dwSizeLow; public int dwSizeHigh; public FILETIME LastModifiedTime; public FILETIME ExpireTime; public FILETIME LastAccessTime; public FILETIME LastSyncTime; public IntPtr lpHeaderInfo; public int dwHeaderInfoSize; public IntPtr lpszFileExtension; public int dwExemptDelta; } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] public struct SYSTEMTIME { public short wYear; public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; } [DllImport("kernel32.dll",SetLastError=true, CharSet=CharSet.Auto)] public static extern int FileTimeToSystemTime( IntPtr lpFileTime, IntPtr lpSystemTime); [DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)] public static extern IntPtr FindFirstUrlCacheEntry( [MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern, IntPtr lpFirstCacheEntryInfo, ref int lpdwFirstCacheEntryInfoBufferSize); [DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)] public static extern bool FindNextUrlCacheEntry( IntPtr hEnumHandle, IntPtr lpNextCacheEntryInfo, ref int lpdwNextCacheEntryInfoBufferSize); [DllImport("wininet.dll")] public static extern bool FindCloseUrlCache( IntPtr hEnumHandle); const int ERROR_NO_MORE_ITEMS = 259; #endregion #region FileTimeToSystemTime private string FILETIMEtoDataTime(FILETIME time) { IntPtr filetime = Marshal.AllocHGlobal( Marshal.SizeOf(typeof(FILETIME)) ); IntPtr systime = Marshal.AllocHGlobal( Marshal.SizeOf(typeof(SYSTEMTIME)) ); Marshal.StructureToPtr(time,filetime,true); FileTimeToSystemTime( filetime ,systime); SYSTEMTIME st = (SYSTEMTIME) Marshal.PtrToStructure(systime,typeof(SYSTEMTIME)); string Time = st.wYear.ToString()+"."+st.wMonth.ToString()+"."+st.wDay.ToString()+"."+st.wHour.ToString()+"."+st.wMinute.ToString()+"."+st.wSecond.ToString(); return Time; } #endregion #region 加载数据 private void FileOk_Click(object sender, System.EventArgs e) { int nNeeded = 0, nBufSize; IntPtr buf; INTERNET_CACHE_ENTRY_INFO CacheItem; IntPtr hEnum; bool r; FindFirstUrlCacheEntry( null, IntPtr.Zero, ref nNeeded ); if ( Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS ) return; nBufSize = nNeeded; buf = Marshal.AllocHGlobal( nBufSize ); hEnum = FindFirstUrlCacheEntry( null, buf, ref nNeeded ); while ( true ) { CacheItem = (INTERNET_CACHE_ENTRY_INFO) Marshal.PtrToStructure( buf, typeof(INTERNET_CACHE_ENTRY_INFO) ); string modifiedTime = FILETIMEtoDataTime(CacheItem.LastModifiedTime); string expireTime = FILETIMEtoDataTime(CacheItem.ExpireTime); string accessTime = FILETIMEtoDataTime(CacheItem.LastAccessTime); string syncTime = FILETIMEtoDataTime(CacheItem.LastSyncTime); #region 获得数据,存入数据库 try { //此處遍歷CacheItem即可 //例如 string s = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName); 可以获取CacheItem的本地文件路径 这里如何把文件拷贝到另外一个文件夹中去,普通的文件拷贝好像不行 } catch { //異常處理 } #endregion string s = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName); nNeeded = nBufSize; r = FindNextUrlCacheEntry( hEnum, buf, ref nNeeded ); if ( !r && Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS ) break; if ( !r && nNeeded > nBufSize ) { nBufSize = nNeeded; buf = Marshal.ReAllocHGlobal( buf, (IntPtr) nBufSize ); FindNextUrlCacheEntry( hEnum, buf, ref nNeeded ); } } MessageBox.Show("系统数据加载完毕!"); Marshal.FreeHGlobal( buf ); } #endregion
本文参照CSDN博客:http://blog.csdn.net/21aspnet/archive/2007/03/24/1539828.aspx |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论