C 讀取IE快取檔案

2021-09-06 01:29:06 字數 4021 閱讀 8616

背景:大家知道,在我們訪問乙個**的時候。系統會把這個**上的,動畫等內容全部快取到internet臨時資料夾中。 我們可以通過 :\documents and settings\\local settings\temporary internet files訪問。但是可能我們都沒有想到,裡面的檔案實際卻不同於我們系統中其他的資料夾和檔案的關係。 

舉例說明,我們在vs.net下寫乙個函式來返回指定資料夾中的資料夾和所有檔案時,但我們把internet臨時資料夾的位址傳進去時,系統只會返回乙個檔案,那就是desktop.ini(每個資料夾都有),還有乙個隱藏的資料夾。所以這就證明了在臨時資料夾中的檔案並不是按照普通的資料夾與檔案的方式存在的。 

其實windows是把臨時檔案全部存在乙個隱藏的資料夾中,這個資料夾是我們都看不到的,然後靠乙個index.dat的索引把內容全部讀出來回顯給使用者。 

那我們怎麼用程式來讀取其中的內容呢?  

首先要引用乙個user.dll,在系統資料夾中。然後利用它其中的一些函式就可以遍歷整個資料夾,並獲得其中每個檔案的資訊。 

[dllimport(

"wininet.dll

", setlasterror

=true

, charset

=charset.auto)]  

public

static

extern

intptr findfirsturlcacheentry(  

[marshalas(unmanagedtype.lptstr)] 

string

lpszurlsearchpattern,  

intptr lpfirstcacheentryinfo,  

refint

lpdwfirstcacheentryinfobuffersize);  

[dllimport(

"wininet.dll

", setlasterror

=true

, charset

=charset.auto)]  

public

static

extern

bool

findnexturlcacheentry(  

intptr henumhandle,  

intptr lpnextcacheentryinfo,  

refint

lpdwnextcacheentryinfobuffersize);  

[dllimport(

"wininet.dll

")]  

public

static

extern

bool

findcloseurlcache(  

intptr henumhandle);  

引入以上三個函式來遍歷臨時資料夾,然後再引用  

[dllimport(

"kernel32.dll

",setlasterror

=true

, charset

=charset.auto)]  

public

static

extern

intfiletimetosystemtime(  

intptr lpfiletime,  

intptr lpsystemtime);  

用來把 filetime時間格式轉化成c#中的string型別,以便我們進一步操作。  

主體程式如下:  

#region

引入dll  

[structlayout(layoutkind.sequential, charset

=charset.auto)]  

public

struct

internet_cache_entry_info  

[structlayout(layoutkind.sequential, charset

=charset.auto)]  

public

struct

systemtime  

[dllimport(

"kernel32.dll

",setlasterror

=true

, charset

=charset.auto)]  

public

static

extern

intfiletimetosystemtime(  

intptr lpfiletime,  

intptr lpsystemtime);  

[dllimport(

"wininet.dll

", setlasterror

=true

, charset

=charset.auto)]  

public

static

extern

intptr findfirsturlcacheentry(  

[marshalas(unmanagedtype.lptstr)] 

string

lpszurlsearchpattern,  

intptr lpfirstcacheentryinfo,  

refint

lpdwfirstcacheentryinfobuffersize);  

[dllimport(

"wininet.dll

", setlasterror

=true

, charset

=charset.auto)]  

public

static

extern

bool

findnexturlcacheentry(  

intptr henumhandle,  

intptr lpnextcacheentryinfo,  

refint

lpdwnextcacheentryinfobuffersize);  

[dllimport(

"wininet.dll

")]  

public

static

extern

bool

findcloseurlcache(  

intptr henumhandle);  

const

interror_no_more_items 

=259

;  #endregion

#region

filetimetosystemtime  

private

string

filetimetodatatime(filetime time)  

#endregion

#region

載入資料  

private

void

fileok_click(

object

sender, system.eventargs e)  

catch

#endregion

strings =

marshal.ptrtostringauto(cacheitem.lpszsourceurlname);  

nneeded 

=nbufsize;  r =

findnexturlcacheentry( henum, buf, 

refnneeded );  

if( !r 

&&marshal.getlastwin32error() 

==error_no_more_items )  

break

;  if( !

r &&

nneeded 

>

nbufsize )  

}  messagebox.show(

"系統資料載入完畢!

");  

marshal.freehglobal( buf );  

}  #endregion

IE快取機制

前提 ie有個快取機制,對請求的url進行判斷,發現短時間內請求的url相同,則使用快取的資料,而不是去重新向伺服器獲取一次資料。資料快取也有好處,但對於需要經常去後台獲取資料更新的需求來說,這就是個麻煩了。那怎麼解決這個問題呢?既然是對相同的url認為是重複請求,那我就想辦法每次請求的url值都不...

C 讀取檔案

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.window...

c 讀取檔案

用c 讀取檔案內容中文是亂碼的解決方法 方法1 streamreader din new streamreader c 1.txt system.text.encoding.getencoding gb2312 string html while din.peek 1 din.close 方法2 s...