日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ IE缓存管理研究

發(fā)布時(shí)間:2023/12/10 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ IE缓存管理研究 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言
關(guān)于IE緩存管理方面的資料非常少,網(wǎng)上雖然有部分文章介紹,也有工具下載(如搜索緩存或清除緩存等),但都不夠全面和深入。
另外,IE緩存管理主要依賴幾個(gè)index.dat文件和wininet庫,而MSDN對wininet庫的幫助非常簡單,而且沒有示例代碼。
網(wǎng)上能夠找到的資料大部分都是對wininet的http協(xié)議處理接口方面的介紹,對于緩存處理部分介紹的很少,加上這部分接口定義得有點(diǎn)晦澀,所以讓人覺得有點(diǎn)困繞。
本文結(jié)合自己的項(xiàng)目經(jīng)驗(yàn),對IE的緩存機(jī)制,特別是wininet庫中緩存管理的接口使用,提出全面深入的說明。
弄懂了wininet緩存管理接口,以后寫緩存監(jiān)控、緩存搜索和緩存清理等工具就非常簡單了。
?
2.?????? 術(shù)語定義
無。

3.?????? IE緩存文件
3.1.?????? IE緩存分類
IE緩存主要分為3大類:cookie、臨時(shí)文件(包括未過期的資源和脫機(jī)文件)、歷史記錄。
這3類緩存分別都有一個(gè)索引文件,文件名為index.dat。
存放路徑如下(以我的電腦為例):
緩存內(nèi)容索引:C:/Documents and Settings/liyafeng/Local Settings/Temporary Internet Files/Content.IE5/index.dat
緩存cookie索引:C:/Documents and Settings/liyafeng/Cookies/index.dat
歷史記錄索引:C:/Documents and Settings/liyafeng/Local Settings/History/History.IE5/index.dat。
這3個(gè)index.dat文件格式被加密處理過,微軟沒有公開也不打算公開文件格式,這種做法被很多人指責(zé),但是微軟依然我行我素。
通過IE的internet選項(xiàng)清除緩存時(shí)不能刪除index.dat文件,但是在磁盤清除臨時(shí)文件時(shí)會(huì)刪除這3個(gè)index.dat文件。
通過IE清除緩存的方法如下:
?
目前訪問這些索引文件的唯一方法是通過wininet庫的相關(guān)接口,這也是本文重點(diǎn)介紹的地方。
注意:緩存的臨時(shí)文件被文件系統(tǒng)做了特殊處理,只能通過完整目錄路徑訪問,否則無法看到,即使你顯示所有文件和系統(tǒng)文件。

3.2.?????? IE緩存管理的流程
流程如下:
1、? 啟動(dòng)IE。
2、? 如果不存在就創(chuàng)建緩存內(nèi)容索引:C:/Documents and Settings/liyafeng/Local Settings/Temporary Internet Files/Content.IE5/index.dat。
3、? 如果不存在就創(chuàng)建cookie索引:C:/Documents and Settings/liyafeng/Cookies/index.dat。
4、? 如果不存在歷史記錄就創(chuàng)建歷史索引:C:/Documents and Settings/liyafeng/Local Settings/History/History.IE5/index.dat。
5、? 調(diào)用InternetOpen初始化一個(gè)IE應(yīng)用。
6、? 設(shè)置回調(diào)函數(shù),通過InternetSetStatusCallback。
7、? 枚舉cookie列表。
8、? 枚舉臨時(shí)文件列表。
9、? 枚舉歷史記錄列表。
10、????????????? 枚舉當(dāng)前用戶的訪問列表。
11、????????????? 查詢當(dāng)前訪問的url是否被緩存。
12、????????????? 如果被緩存,則從緩存中讀取相應(yīng)的信息,包括最后修改時(shí)間、最后訪問時(shí)間和過期時(shí)間。
13、????? 發(fā)送http請求。
14、????? http服務(wù)器會(huì)檢查訪問的資源是否過期,如果未過期,則會(huì)返回“304 Not Modified”。
15、????? 根據(jù)緩存的索引信息,從本地臨時(shí)文件中提取內(nèi)容。
16、????? 如果第11步中沒有被緩存,則直接從http服務(wù)器下載資源。
?
4.?????? Wininet庫的緩存管理接口
4.1.?????? 簡介
Wininet庫內(nèi)置有簡單卻靈活的緩沖支持。從網(wǎng)絡(luò)接收到的任何數(shù)據(jù)都會(huì)緩存到硬盤中,然后在后續(xù)請求中被獲取。應(yīng)用程序可以控制每個(gè)請求的緩存。對于來自服務(wù)器的HTTP請求,大多數(shù)收到的頭部也被緩存。當(dāng)從緩存中為HTTP請求獲取響應(yīng)時(shí),也會(huì)把緩存的頭部數(shù)據(jù)返回給調(diào)用者。這使得數(shù)據(jù)下載對于用戶是透明的,無論數(shù)據(jù)是來自緩存還是來自網(wǎng)絡(luò)。
??? 接口分為枚舉緩存、創(chuàng)建緩存、查詢緩存和刪除緩存,以及對緩存組的操作。
?
4.2.?????? 枚舉緩存
FindFirstUrlCacheEntry? 開始對緩存的枚舉
FindFirstUrlCacheEntryEx??? 開始對緩存的過濾型枚舉
FindNextUrlCacheEntry?? 返回緩存中的下一個(gè)條目
FindNextUrlCacheEntryEx 在過濾型枚舉中返回下一個(gè)緩存條目
FindCloseUrlCache?? 關(guān)閉指定的枚舉句柄
FindFirstUrlCacheEntry和FindNextUrlCacheEntry函數(shù)可枚舉緩存中存儲(chǔ)的信息。FindFirstUrlCacheEntry使用傳入的搜索模式、緩沖區(qū)及其尺寸來創(chuàng)建枚舉句柄,并返回第一個(gè)緩存條目。FindNextUrlCacheEntry使用FindFirstUrlCacheEntry創(chuàng)建的句柄,一個(gè)緩沖區(qū)及其尺寸,返回下一個(gè)緩存條目。
這兩個(gè)函數(shù)都在緩沖區(qū)中存入一個(gè)INTERNET_CACHE_ENTRY_INFO條目。對于各個(gè)條目,結(jié)構(gòu)體的大小是不同的。如果傳入的緩沖區(qū)尺寸不夠大,則函數(shù)調(diào)用失敗,GetLastError返回ERROR_INSUFFICIENT_BUFFER。此時(shí)緩沖區(qū)尺寸參數(shù)值會(huì)指示緩存條目所需的緩沖區(qū)尺寸,應(yīng)該分配一個(gè)這么大的緩沖區(qū),然后重新調(diào)用函數(shù)。
INTERNET_CACHE_ENTRY_INFO結(jié)構(gòu)體包含結(jié)構(gòu)體尺寸、緩存信息的URL、本地文件名、緩存條目類型、使用計(jì)數(shù)、命中率、尺寸、最后修改時(shí)間、失效時(shí)間、最后訪問時(shí)間、最后同步時(shí)間、頭部信息、頭部信息尺寸和文件擴(kuò)展名信息。
FindFirstUrlCacheEntry函數(shù)要求傳入搜索模式和用于存儲(chǔ)INTERNET_CACHE_ENTRY_INFO結(jié)構(gòu)體的緩沖區(qū)及其尺寸。當(dāng)前僅實(shí)現(xiàn)了默認(rèn)搜索模式,它返回所有緩存條目。
緩存枚舉完成后,應(yīng)該用FindCloseUrlCache關(guān)閉緩存枚舉句柄。
注意:FindNextUrlCacheEntry返回FALSE時(shí),有兩種可能。一種是INTERNET_CACHE_ENTRY_INFO條目分配的緩沖區(qū)不夠,另一種可能是枚舉結(jié)束。
關(guān)于緩存區(qū)不夠如何處理,還有嵌入式指針問題,在后面查詢緩存中會(huì)給出示例代碼。
?
4.3.?????? 查詢緩存條目信息
GetUrlCacheEntryInfo??????? 獲取某緩存條目的信息
GetUrlCacheEntryInfoEx???? 轉(zhuǎn)換任何會(huì)被HttpSendRequest應(yīng)用于離線模式的緩存重定向,然后搜索指定的URL。
GetUrlCacheEntryInfo函數(shù)獲取指定URL的INTERNET_CACHE_ENTRY_INFO結(jié)構(gòu)體。結(jié)構(gòu)體包含結(jié)構(gòu)體尺寸、緩存信息的URL、本地文件名、緩存條目類型、使用計(jì)數(shù)、命中率、尺寸、最后修改時(shí)間、失效時(shí)間、最后訪問時(shí)間、最后同步時(shí)間、頭部信息、頭部信息尺寸和文件擴(kuò)展名信息。
GetUrlCacheEntryInfo接受一個(gè)URL、一個(gè)用于保存INTERNET_CACHE_ENTRY_INFO結(jié)構(gòu)體的緩沖區(qū)及其尺寸。如果找到了給定的URL,其信息會(huì)復(fù)制到緩沖區(qū)中。否則,函數(shù)調(diào)用失敗,GetLastError返回ERROR_FILE_NOT_FOUND。如果緩沖區(qū)大小不足以保存緩存條目信息,則函數(shù)調(diào)用失敗,GetLastError返回ERROR_INSUFFICIENT_BUFFER。此時(shí)緩沖區(qū)尺寸參數(shù)會(huì)指示所需要的緩沖區(qū)尺寸。
GetUrlCacheEntry不會(huì)做URL解析,所以對于含有錨定(#)的URL,即使請求的資源在緩存中,函數(shù)也會(huì)找不到。比如說,如果傳入 http://example.com/example.htm#sample,即使它在緩存中,函數(shù)也會(huì)返回ERROR_FILE_NOT_FOUND。
typedef struct _INTERNET_CACHE_ENTRY_INFOA {
??? DWORD dwStructSize;???????? // version of cache system.
??? LPSTR?? lpszSourceUrlName;??? // embedded pointer to the URL name string.
??? LPSTR?? lpszLocalFileName;? // embedded pointer to the local file name.
??? DWORD CacheEntryType;?????? // cache type bit mask.
??? DWORD dwUseCount;?????????? // current users count of the cache entry.
??? DWORD dwHitRate;??????????? // num of times the cache entry was retrieved.
??? DWORD dwSizeLow;??????????? // low DWORD of the file size.
??? DWORD dwSizeHigh;?????????? // high DWORD of the file size.
??? FILETIME LastModifiedTime;? // last modified time of the file in GMT format.
??? FILETIME ExpireTime;??????? // expire time of the file in GMT format
??? FILETIME LastAccessTime;??? // last accessed time in GMT format
??? FILETIME LastSyncTime;????? // last time the URL was synchronized
??????????????????????????????? // with the source
??? LPSTR?? lpHeaderInfo;??????? // embedded pointer to the header info.
??? DWORD dwHeaderInfoSize;???? // size of the above header.
??? LPSTR?? lpszFileExtension;? // File extension used to retrive the urldata as a file.
??????? union {???????????????????? // Exemption delta from last access time.
??????????????? DWORD dwReserved;
??????????????? DWORD dwExemptDelta;
??? };????????????????????????? // Exemption delta from last access
} INTERNET_CACHE_ENTRY_INFOA, * LPINTERNET_CACHE_ENTRY_INFOA;
注意:embedded pointer即嵌入式指針,是一個(gè)比較晦澀的點(diǎn),真實(shí)意義是在結(jié)構(gòu)體后分配一塊連續(xù)內(nèi)存,然后讓這個(gè)指針指向它,就好象是嵌入在結(jié)構(gòu)體內(nèi),因此得名。
不知道是否解釋清楚,后面以示例代碼來說明,呵呵。
示例代碼:
INTERNET_CACHE_ENTRY_INFOA *lpCacheEntryInfo = new INTERNET_CACHE_ENTRY_INFOA;
DWORD cbCacheEntryInfo = sizeof(INTERNET_CACHE_ENTRY_INFOA);
BOOL fOk = GetUrlCacheEntryInfoA(lpszUrl,lpCacheEntryInfo,&cbCacheEntryInfo);
if( !fOk && cbCacheEntryInfo > sizeof(INTERNET_CACHE_ENTRY_INFOA) )
{
??? lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFOA) new char[cbCacheEntryInfo];//強(qiáng)制轉(zhuǎn)換,保證指針可以指向結(jié)構(gòu)體內(nèi)部。
??? fOk = GetUrlCacheEntryInfoA(lpszUrl,lpCacheEntryInfo,&cbCacheEntryInfo);
??? PR_DEBUG("do again:fOk:%d,cbCacheEntryInfo:%d",fOk,cbCacheEntryInfo);
}
?
4.4.?????? 創(chuàng)建緩存條目
?CreateUrlCacheEntry 分配請求的緩存存儲(chǔ)器,創(chuàng)建本地文件名用于保存對應(yīng)源名稱的緩存條目
CommitUrlCacheEntry 緩存存儲(chǔ)器中某特定文件中的數(shù)據(jù),將它與給定的URL關(guān)聯(lián)起來
使用CreateUrlCacheEntry和CommitUrlCacheEntry可以創(chuàng)建緩存條目。
CreateUrlCacheEntry接受URL、預(yù)期的文件尺寸和文件擴(kuò)展名,創(chuàng)建用于保存相應(yīng)緩存條目的本地文件名。可以使用這個(gè)文件名向本地文件中寫入數(shù)據(jù)。數(shù)據(jù)寫入完成后應(yīng)該調(diào)用CommitUrlCacheEntry。
CommitUrlCacheEntry接受URL、本地文件名、失效時(shí)間、最后修改時(shí)間、緩存條目類型、頭部信息及其尺寸和文件擴(kuò)展名,在緩存存儲(chǔ)器中保存文件數(shù)據(jù),并與給定的URL關(guān)聯(lián)起來。
注意:CreateUrlCacheEntry只是在內(nèi)存中創(chuàng)建緩存條目,必須調(diào)用CommitUrlCacheEntry才寫入index.dat文件中。另外,CreateUrlCacheEntry會(huì)創(chuàng)建一個(gè)空的臨時(shí)文件。CommitUrlCacheEntry會(huì)校驗(yàn)文件名與url的關(guān)系,這是IE防止用戶把臨時(shí)文件挪到其他地方的一種手段。

4.5.?????? 刪除緩存條目
DeleteUrlCacheEntry 如果緩存中存在與源名稱相關(guān)的文件,刪除它。
?DeleteUrlCacheEntry刪除與給定URL相關(guān)的緩存文件。如果沒有找到相應(yīng)的緩存文件,則函數(shù)調(diào)用失敗,GetLastError返回ERROR_FILE_NOT_FOUND。如果緩存文件當(dāng)前被鎖定或者正在使用中,則函數(shù)調(diào)用失敗,GetLastError返回ERROR_ACCESS_DENIED。文件解鎖后會(huì)被刪除。
?
4.6.?????? 獲取緩存文件
RetrieveUrlCacheEntryFile 以文件的形式從緩存中獲取一個(gè)緩存條目
UnlockUrlCacheEntryFile 解鎖因?yàn)槭褂肦etrieveUrlCacheEntryFile從緩存中獲取其文件用于使用而被鎖定的緩存條目。
對于要求某資源的文件名才能的啟動(dòng)的應(yīng)用程序,可使用RetrieveUrlCacheEntryFile和UnlockUrlCacheEntryFile函數(shù)。
不要求文件名的程序應(yīng)該使用RetrieveUrlCacheEntryStream、ReadUrlCacheEntryStream和UnlockUrlCacheEntryStream獲取緩存信息。
RetrieveUrlCacheEntryFile接受一個(gè)URL和用于保存INTERNET_CACHE_ENTRY_INFO結(jié)構(gòu)體的緩沖區(qū)及其尺寸,為調(diào)用者獲取并鎖定緩存文件。
使用完緩存文件后,應(yīng)該調(diào)用UnlockUrlCacheEntryFile解鎖文件。
注意:雖然你也可以直接使用readfile來讀取緩存條目,但是此時(shí)對文件沒有加鎖,因此在讀取的過程中可能會(huì)被修改或刪除,因此推薦使用RetrieveUrlCacheEntryFile。
使用方法:先調(diào)用RetrieveUrlCacheEntryFile獲取條目信息并對文件加鎖,條目信息中有緩存文件的本地文件名,然后調(diào)用readfile讀取文件內(nèi)容,讀取完成后調(diào)用UnlockUrlCacheEntryFile解鎖。
?
4.7.?????? 獲取緩存流
RetrieveUrlCacheEntryStream 提供最高效的、實(shí)現(xiàn)無關(guān)的訪問緩存數(shù)據(jù)的方法。
ReadUrlCacheEntryStream 從RetrieveUrlCacheEntryStream打開的流中讀取緩存數(shù)據(jù)。
RetrieveUrlCacheEntryStream、ReadUrlCacheEntryStream和UnlockUrlCacheEntryStream用于獲取緩存中的資源。
RetrieveUrlCacheEntryStream接受一個(gè)URL,一個(gè)用于存儲(chǔ)INTERNET_CACHE_ENTRY_INFO結(jié)構(gòu)體的緩沖區(qū)及其尺寸和一個(gè)表明是否可以進(jìn)行隨機(jī)讀取的布爾值。如果找到了緩存文件,函數(shù)會(huì)創(chuàng)建到文件的句柄。函數(shù)不做URL解析,所以對于含有錨定(#)的URL,即使資源在緩存中,它也找不到。比如說,如果傳入http://example.com/example.htm#sample,即使它在緩存中,函數(shù)也會(huì)返回ERROR_FILE_NOT_FOUND。
ReadUrlCacheEntryStream要求傳入RetrieveUrlCacheEntryStream創(chuàng)建的句柄、文件偏移量、緩沖區(qū)及其尺寸。如果緩沖區(qū)不足以容納可用數(shù)據(jù),函數(shù)調(diào)用會(huì)失敗,GetLastError返回ERROR_INSUFFICIENT_BUFFER,緩沖區(qū)尺寸參數(shù)會(huì)被設(shè)置為下載資源所需緩沖區(qū)大小。
獲取緩存文件后,應(yīng)該調(diào)用UnlockUrlCacheEntryStream關(guān)閉RetrieveUrlCacheEntryStream創(chuàng)建的句柄。
注意:流操作主要針對不關(guān)心本地文件名的應(yīng)用,所有讀取和關(guān)閉流的操作都必須使用RetrieveUrlCacheEntryStream返回的句柄。
?
4.8.?????? 緩存組操作
CreateUrlCacheGroup 生成一個(gè)緩存組標(biāo)識(shí)
SetUrlCacheEntryGroup 向緩存組添加條目,或者從中刪除條目
DeleteUrlCacheGroup 釋放GROUPID以及緩存索引文件中任何與之相關(guān)的狀態(tài)
要?jiǎng)?chuàng)建緩存組,必須調(diào)用CreateUrlCacheGroup為其生成一個(gè)GROUPID。使用SetUrlCacheEntryGroup函數(shù),提供緩存條目的URL和INTERNET_CACHE_GROUP_ADD標(biāo)志就可以把條目加入到緩存組中。要從緩存組中刪除條目,則傳入條目的URL,使用INTERNET_CACHE_GROUP_REMOVE標(biāo)志。
FindFirstUrlCacheEntryEx和FindNextUrlCacheEntryEx函數(shù)可以枚舉指定緩存組中的條目。完成枚舉后,應(yīng)該用FindCloseUrlCache關(guān)閉枚舉句柄。

總結(jié)

以上是生活随笔為你收集整理的C++ IE缓存管理研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。