ファイル操作 インターネット一時ファイルの保存場所 インターネットキャッシュ インターネット一時ファイルの保存場所は Internet Explorer の場合 下記の手順で確認する事が出来る 1.[ ツール ] [ インターネットオプション ] でインターネットオプション画面のダイアログを表示させる 2.[ 全般 ] タブで [ インターネット一時ファイル ] グループの [ 設定 ] をクリックすると 設定画面のダイアログが表示される 3.[ ファイルの表示 ] をクリックすると表示される [ インターネット一時ファイルフォルダ ] がインターネット一時ファイルの保存場所で有る 例えば ログインユーザ名が xxxxx の場合 既定では 下記のディレクトリ ( フォルダ ) と成る C: Documents and Settings xxxxx Local Settings Temporary Internet Files 因みに クッキーは 1 階層上位の下記のディレクトリ ( フォルダ ) と成る C: Documents and Settings xxxxx Cookies 但し 設定画面のダイアログで [ フォルダの移動 ] をクリックすると 任意の場所に設定する事が出来るので 必ずしも 上記の場所で有るとは限らない 亦 色々な環境の下で使用するアプリケーションに於いては ログインユーザ名の相違等に依り 此れを固定値と仕て扱う事は出来ない インターネット一時ファイルの保存場所を含め デスクトップ お気に入り スタートメニュー システムディレクトリ等の特殊ディレクトリの絶対パスを取得するには Environment クラスの GetFolderPath メソッドを使用する システムディレクトリは Environment.SystemDirectory プロパティでも取得出来る 亦 現在のディレクトリは Environment.CurrentDirectory プロパティに依り取得する 猶.NET Framework 2.0 以降の では My.Computer.FileSystem.SpecialDirectories のプロパティに依り 特殊ディレクトリの一部を取得する事も出来る インターネット一時ファイルの保存場所を取得するには Environment.SpecialFolder 列挙体の InternetCache 定数を用いて 下記の様に記述する ( 戻り値は 絶対パスの文字列 ) System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); -1-
インターネット一時ファイルの削除 総てのインターネット一時ファイルを削除するには インターネット一時ファイルの保存場所を取得して 其の中の総てのファイルを削除すれば良い事に成る 其処で 最も簡単な方法は Directory クラスの GetFiles メソッドを使用して下層ディレクトリを含む総てのファイルの絶対パスを取得して ( 下層にディレクトリが作成され 其処に保存される事が有る為 ) 其等を File クラスか FileInfo クラスの Delete メソッドで削除する事で有る 其のコードを 下記に示す Dim D As String D = System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) Dim F( ) As String F = Directory.GetFiles(D, "*", SearchOption.AllDirectories) For I As Integer = 0 To (F.Length - 1) ' File クラスの Delete メソッド File.Delete(F(I)) ' FileInfo クラスの Delete メソッド ' Dim S As FileInfo = New FileInfo(F(I)) ' S.Delete( ) Next 省略 併し 上記のコードでは 殆どの場合 共有違反の例外が発生して インターネット一時ファイルを削除する事は出来ない 此れは Win32API 関数の DeleteUrlCacheEntry 関数を 下記の様に単純に使用しても 同じで有る ' Win32API 関数の宣言 ( 宣言部分に記述 ) <DllImport("wininet.dll")> _ Private Shared Function DeleteUrlCacheEntry( _ ByVal lpszurlname As String) As Integer Dim D As String D = System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) Dim F( ) As String F = Directory.GetFiles(D, "*", SearchOption.AllDirectories) Dim R As Integer For I As Integer = 0 To (F.Length - 1) ' DeleteUrlCacheEntry 関数 R = DeleteUrlCacheEntry(F(I)) Next 省略 此れは インターネット一時ファイルの保存場所が システムに保護された特殊なディレクトリで有るからで有る 此れを削除する為には 色々な手順を踏む必要が有る 下記に 其の色々な手順を踏んでインターネット一時ファイルを削除するコードを示す -2-
Imports System.Runtime.InteropServices Imports System.Runtime.InteropServices.ComTypes Public Class InternetCacheDelete ' インターネットキャッシュのエントリー情報の構造体 <StructLayout(LayoutKind.Explicit, Size:=80)> _ Public Structure INTERNET_CACHE_ENTRY_INFOA <FieldOffset(0)> Public dwstructsize As UInt32 <FieldOffset(4)> Public lpszsourceurlname As IntPtr <FieldOffset(8)> Public lpszlocalfilename As IntPtr <FieldOffset(12)> Public CacheEntryType As UInt32 <FieldOffset(16)> Public dwusecount As UInt32 <FieldOffset(20)> Public dwhitrate As UInt32 <FieldOffset(24)> Public dwsizelow As UInt32 <FieldOffset(28)> Public dwsizehigh As UInt32 <FieldOffset(32)> Public LastModifiedTime As ComTypes.FILETIME <FieldOffset(40)> Public ExpireTime As ComTypes.FILETIME <FieldOffset(48)> Public LastAccessTime As ComTypes.FILETIME <FieldOffset(56)> Public LastSyncTime As ComTypes.FILETIME <FieldOffset(64)> Public lpheaderinfo As IntPtr <FieldOffset(68)> Public dwheaderinfosize As UInt32 <FieldOffset(72)> Public lpszfileextension As IntPtr <FieldOffset(76)> Public dwreserved As UInt32 <FieldOffset(76)> Public dwexemptdelta As UInt32 End Structure ' インターネットキャッシュのキャッシュグループの列挙を開始する API 関数 <DllImport("wininet.dll", EntryPoint:="FindFirstUrlCacheGroup", _ Shared Function FindFirstUrlCacheGroup( _ ByVal dwflags As Int32, _ ByVal dwfilter As Integer, _ ByVal lpsearchcondition As IntPtr, _ ByVal dwsearchcondition As Int32, _ ByRef lpgroupid As Long, _ ByVal lpreserved As IntPtr) As IntPtr ' キャッシュグループの列挙から次のキャッシュグループを取得する API 関数 EntryPoint:="FindNextUrlCacheGroup", _ Shared Function FindNextUrlCacheGroup( _ -3-
ByVal hfind As IntPtr, _ ByRef lpgroupid As Long, _ ByVal lpreserved As IntPtr) As Boolean ' キャッシュインデックスファイルから特定された GROUPID や関連する状態を開放する API 関数 EntryPoint:="DeleteUrlCacheGroup", _ Shared Function DeleteUrlCacheGroup( _ ByVal GroupId As Long, _ ByVal dwflags As Int32, _ ByVal lpreserved As IntPtr) As Boolean ' インターネットキャッシュの列挙を開始する API 関数 EntryPoint:="FindFirstUrlCacheEntryA", _ Shared Function FindFirstUrlCacheEntry( _ <MarshalAs(UnmanagedType.LPStr)> ByVal lpszurlsearchpattern As String, _ ByVal lpfirstcacheentryinfo As IntPtr, _ ByRef lpdwfirstcacheentryinfobuffersize As Int32) As IntPtr ' インターネットキャッシュから次のエントリーを取得する API 関数 'For PInvoke: Retrieves the next entry in the Internet cache EntryPoint:="FindNextUrlCacheEntryA", _ Shared Function FindNextUrlCacheEntry( _ ByVal hfind As IntPtr, _ ByVal lpnextcacheentryinfo As IntPtr, _ ByRef lpdwnextcacheentryinfobuffersize As Integer) As Boolean ' 関連ファイルをキャッシュから削除する API 関数 EntryPoint:="DeleteUrlCacheEntryA", _ -4-
Shared Function DeleteUrlCacheEntry( _ ByVal lpszurlname As IntPtr) As Boolean ' 定数の宣言 Private Const CACHEGROUP_SEARCH_ALL = &H0 Private Const CACHEGROUP_FLAG_FLUSHURL_ONDELETE = &H2 Private Const ERROR_FILE_NOT_FOUND = &H2 Private Const ERROR_NO_MORE_ITEMS = 259 ' ボタン ( 削除 ) がクリックされた時の処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click Dim GroupId As Long = 0 Dim CacheEntryInfoBufferSizeInitial As Integer = 0 Dim CacheEntryInfoBufferSize As Integer = 0 Dim CacheEntryInfoBuffer As IntPtr = IntPtr.Zero Dim InternetCacheEntry As INTERNET_CACHE_ENTRY_INFOA Dim EnumHandle As IntPtr = IntPtr.Zero Dim ReturnValue As Boolean = False EnumHandle = FindFirstUrlCacheGroup( _ 0, CACHEGROUP_SEARCH_ALL, IntPtr.Zero, 0, GroupId, IntPtr.Zero) ' キャッシュに何も無い場合 If (Not EnumHandle.Equals(IntPtr.Zero) And _ ERROR_NO_MORE_ITEMS.Equals(Marshal.GetLastWin32Error)) Then Exit Sub ' キャッシュグループのエントリー削除 Do ReturnValue = DeleteUrlCacheGroup( _ GroupId, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, IntPtr.Zero) ERROR_FILE_NOT_FOUND.Equals(Marshal.GetLastWin32Error())) Then ReturnValue = FindNextUrlCacheGroup(EnumHandle, GroupId, IntPtr.Zero) (ERROR_NO_MORE_ITEMS.Equals(Marshal.GetLastWin32Error()) Or _ ERROR_FILE_NOT_FOUND.Equals(Marshal.GetLastWin32Error()))) Then Exit Do Loop -5-
' グループに属さない URL の削除 EnumHandle = FindFirstUrlCacheEntry( _ vbnull, IntPtr.Zero, CacheEntryInfoBufferSizeInitial) If (EnumHandle.Equals(IntPtr.Zero) And _ ERROR_NO_MORE_ITEMS.Equals(Marshal.GetLastWin32Error())) Then Exit Sub CacheEntryInfoBufferSize = CacheEntryInfoBufferSizeInitial CacheEntryInfoBuffer = Marshal.AllocHGlobal(CacheEntryInfoBufferSize) EnumHandle = FindFirstUrlCacheEntry( _ vbnull, CacheEntryInfoBuffer, CacheEntryInfoBufferSizeInitial) Do InternetCacheEntry = CType(Marshal.PtrToStructure( _ CacheEntryInfoBuffer, GetType(INTERNET_CACHE_ENTRY_INFOA)), _ INTERNET_CACHE_ENTRY_INFOA) CacheEntryInfoBufferSizeInitial = CacheEntryInfoBufferSize ReturnValue = DeleteUrlCacheEntry(InternetCacheEntry.lpszSourceUrlName) If (Not ReturnValue) Then 'Console.WriteLine("Error Deleting: {0}", Marshal.GetLastWin32Error()) ReturnValue = FindNextUrlCacheEntry( _ EnumHandle, CacheEntryInfoBuffer, CacheEntryInfoBufferSizeInitial) ERROR_NO_MORE_ITEMS.Equals(Marshal.GetLastWin32Error())) Then Exit Do CacheEntryInfoBufferSizeInitial > CacheEntryInfoBufferSize) Then CacheEntryInfoBufferSize = CacheEntryInfoBufferSizeInitial Dim tempintptr As New IntPtr(CacheEntryInfoBufferSize) CacheEntryInfoBuffer = Marshal.ReAllocHGlobal(CacheEntryInfoBuffer, tempintptr) ReturnValue = FindNextUrlCacheEntry( _ EnumHandle, CacheEntryInfoBuffer, CacheEntryInfoBufferSizeInitial) Loop Marshal.FreeHGlobal(CacheEntryInfoBuffer) MessageBox.Show(" 削除しました ") End Sub End Class 省略 -6-