大家知道,在我們?cè)L問一個(gè)網(wǎng)站的時(shí)候。系統(tǒng)會(huì)把這個(gè)網(wǎng)站上的圖片,動(dòng)畫等內(nèi)容全部緩存到Internet臨時(shí)文件夾中。 我們可以通過 <Drives>:\Documents and Settings\<user>\Local Settings\Temporary Internet Files訪問。但是可能我們都沒有想到,里面的文件實(shí)際卻不同于我們系統(tǒng)中其他的文件夾和文件的關(guān)系。
舉例說明,我們?cè)赩S.net下寫一個(gè)函數(shù)來返回指定文件夾中的文件夾和所有文件時(shí),但我們把Internet臨時(shí)文件夾的地址傳進(jìn)去時(shí),系統(tǒng)只會(huì)返回一個(gè)文件,那就是desktop.ini(每個(gè)文件夾都有),還有一個(gè)隱藏的文件夾。所以這就證明了在臨時(shí)文件夾中的文件并不是按照普通的文件夾與文件的方式存在的。
其實(shí)windows是把臨時(shí)文件全部存在一個(gè)隱藏的文件夾中,這個(gè)文件夾是我們都看不到的,然后靠一個(gè)index.dat的索引把內(nèi)容全部讀出來回顯給用戶。
那我們?cè)趺从贸绦騺碜x取其中的內(nèi)容呢? 因?yàn)檫@幾天在幫同學(xué)完成他的畢業(yè)設(shè)計(jì),所以研究了一下。 首先要引用一個(gè)user.dll,在系統(tǒng)文件夾中。然后利用它其中的一些函數(shù)就可以遍歷整個(gè)文件夾,并獲得其中每個(gè)文件的信息。
[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);
引入以上三個(gè)函數(shù)來遍歷臨時(shí)文件夾,然后再引用
[DllImport("kernel32.dll",SetLastError=true, CharSet=CharSet.Auto)] public static extern int FileTimeToSystemTime( IntPtr lpFileTime, IntPtr lpSystemTime);
用來把 FileTime時(shí)間格式轉(zhuǎn)化成c#中的string類型,以便我們進(jìn)一步操作。
主體程序如下:
#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 加載數(shù)據(jù) 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 獲得數(shù)據(jù),存入數(shù)據(jù)庫 try {
//此處遍歷CacheItem即可 //例如 string s = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName); } 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("系統(tǒng)數(shù)據(jù)加載完畢!"); Marshal.FreeHGlobal( buf );
}
#endregion
|