|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Internet Routines FindFirstUrlCacheEntry: Delete the IE Cache |
||
Posted: | Monday December 6, 1999 | |
Updated: | Monday December 26, 2011 | |
Applies to: | VB4-32, VB5, VB6 | |
Developed with: | VB6, Windows NT4 | |
OS restrictions: | None | |
Author: | VBnet - Randy Birch | |
Related: |
FindFirstUrlCacheEntry: Obtain the Contents of the IE Cache FindFirstUrlCacheEntry: Delete the IE Cache CoCreateInstance: Delete the IE History Cache |
|
Prerequisites |
Internet Explorer 3 or later. Note this is an IE-specific API - other browsers don't use the Windows temporary internet files cache for local file storage. |
|
Now
that the method to list the Internet cache contents has been determined, the next logical step is programmatically deleting all or specific
files. The code here shows how to populate a list with cache files, and either delete the selected item or all files. To protect deletion of cookies, which may contain passwords or other persistent information you want to keep, the Delete All method checks first for the "Cookie" keyword in the URL string, and skips those files. When a single list item is selected the Delete Selected button is disabled if it contains the word "Cookie". Note: Although all delete routines reload the data from the cache following a deletion, I have found that when performing a Delete All the file system may not have completed the deletion of files before GetCacheURLList executes. This generates an accurate (but misleading) listing showing the files deletion as still present. Therefore, in such cases it may be prudent to delay the call to GetCacheURLList by adding a timer, or leave it up to the user to invoke the routine via a manual call. |
BAS Module Code |
None. |
|
Form Code |
To a form, add a listbox (List1), three command buttons (Command1/2/3) and a label (Label1). The Resize event will take care of positioning the controls, and the Load event will set their captions. Setting the list's Sorted property will make viewing the information easier. Add the following code: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const ERROR_CACHE_FIND_FAIL As Long = 0 Private Const ERROR_CACHE_FIND_SUCCESS As Long = 1 Private Const ERROR_FILE_NOT_FOUND As Long = 2 Private Const ERROR_ACCESS_DENIED As Long = 5 Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122 Private Const MAX_PATH As Long = 260 Private Const MAX_CACHE_ENTRY_INFO_SIZE As Long = 4096 Private Const LMEM_FIXED As Long = &H0 Private Const LMEM_ZEROINIT As Long = &H40 Private Const LPTR As Long = (LMEM_FIXED Or LMEM_ZEROINIT) Private Const NORMAL_CACHE_ENTRY As Long = &H1 Private Const EDITED_CACHE_ENTRY As Long = &H8 Private Const TRACK_OFFLINE_CACHE_ENTRY As Long = &H10 Private Const TRACK_ONLINE_CACHE_ENTRY As Long = &H20 Private Const STICKY_CACHE_ENTRY As Long = &H40 Private Const SPARSE_CACHE_ENTRY As Long = &H10000 Private Const COOKIE_CACHE_ENTRY As Long = &H100000 Private Const URLHISTORY_CACHE_ENTRY As Long = &H200000 Private Const URLCACHE_FIND_DEFAULT_FILTER As Long = NORMAL_CACHE_ENTRY Or _ COOKIE_CACHE_ENTRY Or _ URLHISTORY_CACHE_ENTRY Or _ TRACK_OFFLINE_CACHE_ENTRY Or _ TRACK_ONLINE_CACHE_ENTRY Or _ STICKY_CACHE_ENTRY Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type INTERNET_CACHE_ENTRY_INFO dwStructSize As Long lpszSourceUrlName As Long lpszLocalFileName As Long CacheEntryType As Long dwUseCount As Long dwHitRate As Long dwSizeLow As Long dwSizeHigh As Long LastModifiedTime As FILETIME ExpireTime As FILETIME LastAccessTime As FILETIME LastSyncTime As FILETIME lpHeaderInfo As Long dwHeaderInfoSize As Long lpszFileExtension As Long dwExemptDelta As Long End Type Private Declare Function FindFirstUrlCacheEntry Lib "wininet" _ Alias "FindFirstUrlCacheEntryA" _ (ByVal lpszUrlSearchPattern As String, _ lpFirstCacheEntryInfo As Any, _ lpdwFirstCacheEntryInfoBufferSize As Long) As Long Private Declare Function FindNextUrlCacheEntry Lib "wininet" _ Alias "FindNextUrlCacheEntryA" _ (ByVal hEnumHandle As Long, _ lpNextCacheEntryInfo As Any, _ lpdwNextCacheEntryInfoBufferSize As Long) As Long Private Declare Function FindCloseUrlCache Lib "wininet" _ (ByVal hEnumHandle As Long) As Long Private Declare Function DeleteUrlCacheEntry Lib "wininet" _ Alias "DeleteUrlCacheEntryA" _ (ByVal lpszUrlName As String) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (pDest As Any, _ pSource As Any, _ ByVal dwLength As Long) Private Declare Function lstrcpyA Lib "kernel32" _ (ByVal RetVal As String, ByVal Ptr As Long) As Long Private Declare Function lstrlenA Lib "kernel32" _ (ByVal Ptr As Any) As Long Private Declare Function LocalAlloc Lib "kernel32" _ (ByVal uFlags As Long, _ ByVal uBytes As Long) As Long Private Declare Function LocalFree Lib "kernel32" _ (ByVal hMem As Long) As Long Private Sub Form_Load() Command1.Caption = "Get Cache" Command2.Caption = "Delete Selected" Command3.Caption = "Delete All" Label1.Caption = "" End Sub Private Sub Form_Resize() If Me.WindowState <> vbMinimized Then If Me.Width > 3000 Then With Command1 .Left = Me.ScaleWidth - .Width - 200 .Top = 200 End With With Command2 .Left = Command1.Left .Top = Command1.Top + Command1.Height + 100 End With With Command3 .Left = Command1.Left .Top = Command2.Top + Command2.Height + 100 End With With Label1 .Left = 200 .Top = Me.ScaleHeight - 100 - Label1.Height End With With List1 .Left = 200 .Top = 200 .Width = Command1.Left - 300 .Height = (Me.ScaleHeight - 300) - (Me.ScaleHeight - Label1.Top) End With End If End If End Sub Private Sub Command1_Click() With List1 'this speeds up adding to the list 'and eliminates list flicker .Visible = False .Clear Call GetCacheURLList() .Visible = True Label1.Caption = .ListCount & " files listed." End With End Sub Private Sub Command2_Click() Dim cachefile As String Dim currindex As Long Dim currtopindex As Long 'delete the selected file With List1 'because we're going to reload 'the cache following the deletion, 'be nice and save the current list 'position so it can be restored later currtopindex = .TopIndex currindex = .ListIndex cachefile = .List(currindex) Call DeleteUrlCacheEntry(cachefile) 'reload the list, hiding the list box 'to prevent flicker. (This workaround 'will not provided the desired results 'if a DoEvents is added to the 'GetCacheURLList routine!) .Visible = False GetCacheURLList .TopIndex = currtopindex If currindex >= .ListCount Then .ListIndex = currindex - 1 Else .ListIndex = currindex End If .Visible = True Label1.Caption = .ListCount & " files listed." End With End Sub Private Sub Command3_Click() Dim cachefile As String Dim cnt As Long With List1 'delete all files For cnt = 0 To .ListCount - 1 cachefile = .List(cnt) 'if the file is a cookie let's not 'delete it in case it is used to 'store password data. ' 'remove the Instr() test if you want 'to delete cookies as well If InStr(cachefile, "Cookie") = 0 Then Call DeleteUrlCacheEntry(cachefile) End If Next .Visible = False GetCacheURLList .ListIndex = -1 .Visible = True Label1.Caption = .ListCount & " files listed." End With End Sub Private Sub List1_Click() Command2.Enabled = InStr(List1.List(List1.ListIndex), "Cookie") = 0 End Sub Private Sub GetCacheURLList() Dim icei As INTERNET_CACHE_ENTRY_INFO Dim hFile As Long Dim cachefile As String Dim posUrl As Long Dim posEnd As Long Dim dwBuffer As Long Dim pntrICE As Long List1.Clear 'Like other APIs, calling FindFirstUrlCacheEntry or 'FindNextUrlCacheEntry with an buffer of insufficient 'size will cause the API to fail. Call first to 'determine the required buffer size. hFile = FindFirstUrlCacheEntry(0&, ByVal 0, dwBuffer) 'both conditions should be met by the first call If (hFile = ERROR_CACHE_FIND_FAIL) And _ (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then 'The INTERNET_CACHE_ENTRY_INFO data type 'is a variable-length UDT. It is therefore 'necessary to allocate memory for the result 'of the call and to pass a pointer to this 'memory location to the API. pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) 'allocation successful If pntrICE <> 0 Then 'set a Long pointer to the memory location CopyMemory ByVal pntrICE, dwBuffer, 4 'call FindFirstUrlCacheEntry again 'now passing the pointer to the 'allocated memory hFile = FindFirstUrlCacheEntry(vbNullString, _ ByVal pntrICE, _ dwBuffer) 'hfile should = 1 (success) If hFile <> ERROR_CACHE_FIND_FAIL Then 'loop through the cache Do 'the pointer has been filled, so move the 'data back into a ICEI structure CopyMemory icei, ByVal pntrICE, Len(icei) 'CacheEntryType is a long representing 'the type of entry returned If (icei.CacheEntryType And _ NORMAL_CACHE_ENTRY) = NORMAL_CACHE_ENTRY Then 'extract the string from the memory location 'pointed to by the lpszSourceUrlName member 'and add to a list cachefile = GetStrFromPtrA(icei.lpszSourceUrlName) List1.AddItem cachefile End If 'free the pointer and memory associated 'with the last-retrieved file Call LocalFree(pntrICE) 'and again by repeating the procedure but 'now calling FindNextUrlCacheEntry. Again, 'the buffer size set to 0 causing the call 'to fail and return the required size as dwBuffer dwBuffer = 0 Call FindNextUrlCacheEntry(hFile, ByVal 0, dwBuffer) 'allocate and assign the memory to the pointer pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) CopyMemory ByVal pntrICE, dwBuffer, 4 'and call again with the valid parameters. 'If the call fails (no more data), the loop exits. 'If the call is successful, the Do portion of the 'loop is executed again, extracting the data from 'the returned type Loop While FindNextUrlCacheEntry(hFile, ByVal pntrICE, dwBuffer) End If 'hFile End If 'pntrICE End If 'hFile 'clean up by closing the find handle, 'as well as calling LocalFree again 'to be safe Call LocalFree(pntrICE) Call FindCloseUrlCache(hFile) End Sub Private Function GetStrFromPtrA(ByVal lpszA As Long) As String GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0) Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA) End Function |
Comments |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |