文書番号: 326201 - 最終更新日: 2007年12月12日 - リビジョン: 3.3

[HOWTO] Visual C# .NET で WebBrowser コントロールをホストするアプリケーションからキャッシュをクリアする方法

目次

すべて展開する | すべて折りたたむ

概要

この資料では、WinInet アプリケーション プログラミング インターフェイス (API) 関数を使用してキャッシュを直接クリアする方法について手順を追って説明します。

アプリケーションで WebBrowser コントロールをホストしている場合、プログラムからキャッシュをクリアすることが必要な場合があります。ただし、この機能は WebBrowser コントロールのインターフェイスからは使用できません。

WinInet 関数

キャッシュを直接クリアするには、次の WinInet 関数を使用します。
  • 最初のキャッシュ エントリを検索するには、FindFirstURLCacheEntry 関数を使用します。
  • キャッシュを列挙するには、FindNextUrlCacheEntry 関数を使用します。
  • 各エントリを削除するには、DeleteUrlCacheEntry 関数を使用します。
この資料のサンプル コードでは、これらすべての関数を使用します。

: これらの関数は、Microsoft Internet Explorer 5 を使用している場合のみ使用できます。そのため、コードで適切なチェックを行ってエラーを回避する必要があります (この資料のサンプル コードにはこのチェックが含まれています)。

Visual C# .NET でキャッシュをクリアする手順

Visual C# .NET で WinInet 関数を使用してキャッシュ内のすべてのファイルをクリアするには、次の手順を実行します。
  1. Microsoft Visual Studio .NET を起動します。
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  3. [新しいプロジェクト] ダイアログ ボックスで [プロジェクトの種類] ボックスの一覧の [Visual C# プロジェクト] をクリックし、[テンプレート] ボックスの一覧の [コンソール アプリケーション] をクリックし、[OK] をクリックします。
  4. Class1.cs クラスのコードを、次のコードに置き換えます。
    using System;
    using System.Runtime.InteropServices;
    
    // Visual C# version of Q326201
    namespace Q326201CS
    {
        // Class for deleting the cache.
        class DeleteCache
        {
            // For PInvoke: Contains information about an entry in the Internet cache
            [StructLayout(LayoutKind.Explicit, Size=80)]
            public struct INTERNET_CACHE_ENTRY_INFOA
            {
                [FieldOffset(0)]  public uint dwStructSize;
                [FieldOffset(4)]  public IntPtr lpszSourceUrlName;
                [FieldOffset(8)]  public IntPtr lpszLocalFileName;
                [FieldOffset(12)] public uint CacheEntryType;
                [FieldOffset(16)] public uint dwUseCount;
                [FieldOffset(20)] public uint dwHitRate;
                [FieldOffset(24)] public uint dwSizeLow;
                [FieldOffset(28)] public uint dwSizeHigh;
                [FieldOffset(32)] public FILETIME LastModifiedTime;
                [FieldOffset(40)] public FILETIME ExpireTime;
                [FieldOffset(48)] public FILETIME LastAccessTime;
                [FieldOffset(56)] public FILETIME LastSyncTime;
                [FieldOffset(64)] public IntPtr lpHeaderInfo;
                [FieldOffset(68)] public uint dwHeaderInfoSize;
                [FieldOffset(72)] public IntPtr lpszFileExtension;
                [FieldOffset(76)] public uint dwReserved;
                [FieldOffset(76)] public uint dwExemptDelta;
            }
    
            // For PInvoke: Initiates the enumeration of the cache groups in the Internet cache
            [DllImport(@"wininet",
                SetLastError=true,
                CharSet=CharSet.Auto,
                EntryPoint="FindFirstUrlCacheGroup",
                CallingConvention=CallingConvention.StdCall)]
            public static extern IntPtr FindFirstUrlCacheGroup(
                int dwFlags,
                int dwFilter,
                IntPtr lpSearchCondition,
                int dwSearchCondition,
                ref long lpGroupId,
                IntPtr lpReserved);
    
            // For PInvoke: Retrieves the next cache group in a cache group enumeration
            [DllImport(@"wininet",
                SetLastError=true,
                CharSet=CharSet.Auto,
                EntryPoint="FindNextUrlCacheGroup",
                CallingConvention=CallingConvention.StdCall)]
            public static extern bool FindNextUrlCacheGroup(
                IntPtr hFind,
                ref long lpGroupId,
                IntPtr lpReserved);
    
            // For PInvoke: Releases the specified GROUPID and any associated state in the cache index file
            [DllImport(@"wininet", 
                SetLastError=true, 
                CharSet=CharSet.Auto, 
                EntryPoint="DeleteUrlCacheGroup", 
                CallingConvention=CallingConvention.StdCall)]
            public static extern bool DeleteUrlCacheGroup(
                long GroupId,
                int dwFlags,
                IntPtr lpReserved);
    
            // For PInvoke: Begins the enumeration of the Internet cache
            [DllImport(@"wininet",
                SetLastError=true,
                CharSet=CharSet.Auto,
                EntryPoint="FindFirstUrlCacheEntryA",
                CallingConvention=CallingConvention.StdCall)]
            public static extern IntPtr FindFirstUrlCacheEntry(
                [MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,
                IntPtr lpFirstCacheEntryInfo,
                ref int lpdwFirstCacheEntryInfoBufferSize);
    
            // For PInvoke: Retrieves the next entry in the Internet cache
            [DllImport(@"wininet",
                SetLastError=true,
                CharSet=CharSet.Auto,
                EntryPoint="FindNextUrlCacheEntryA",
                CallingConvention=CallingConvention.StdCall)]
            public static extern bool FindNextUrlCacheEntry(
                IntPtr hFind,
                IntPtr lpNextCacheEntryInfo,
                ref int lpdwNextCacheEntryInfoBufferSize);
    
            // For PInvoke: Removes the file that is associated with the source name from the cache, if the file exists
            [DllImport(@"wininet",
                SetLastError=true,
                CharSet=CharSet.Auto,
                EntryPoint="DeleteUrlCacheEntryA",
                CallingConvention=CallingConvention.StdCall)]
            public static extern bool DeleteUrlCacheEntry(
                IntPtr lpszUrlName);
    
            [STAThread]
            static void Main(string[] args)
            {
                // Indicates that all of the cache groups in the user's system should be enumerated
                const int CACHEGROUP_SEARCH_ALL = 0x0;
                // Indicates that all the cache entries that are associated with the cache group
                // should be deleted, unless the entry belongs to another cache group.
                const int CACHEGROUP_FLAG_FLUSHURL_ONDELETE = 0x2;
                // File not found.
                const int ERROR_FILE_NOT_FOUND = 0x2;
                // No more items have been found.
                const int ERROR_NO_MORE_ITEMS = 259;
                // Pointer to a GROUPID variable
                long groupId = 0;
    
                // Local variables
                int cacheEntryInfoBufferSizeInitial = 0;
                int cacheEntryInfoBufferSize = 0;
                IntPtr cacheEntryInfoBuffer = IntPtr.Zero;
                INTERNET_CACHE_ENTRY_INFOA internetCacheEntry;
                IntPtr enumHandle = IntPtr.Zero;
                bool returnValue = false;
    
                // Delete the groups first.
                // Groups may not always exist on the system.
                // For more information, visit the following Microsoft Web site:
                // http://msdn.microsoft.com/library/?url=/workshop/networking/wininet/overview/cache.asp			
                // By default, a URL does not belong to any group. Therefore, that cache may become
                // empty even when the CacheGroup APIs are not used because the existing URL does not belong to any group.			
                enumHandle = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL, IntPtr.Zero, 0, ref groupId, IntPtr.Zero);
                // If there are no items in the Cache, you are finished.
                if (enumHandle != IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
                    return;
    
                // Loop through Cache Group, and then delete entries.
                while(true)
                {
                    // Delete a particular Cache Group.
                    returnValue = DeleteUrlCacheGroup(groupId, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, IntPtr.Zero);
                    if (!returnValue && ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error())
                    {	
                        returnValue = FindNextUrlCacheGroup(enumHandle, ref groupId, IntPtr.Zero);
                    }
    
                    if (!returnValue && (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()))
                        break;
                }
    
                // Start to delete URLs that do not belong to any group.
                enumHandle = FindFirstUrlCacheEntry(null, IntPtr.Zero, ref cacheEntryInfoBufferSizeInitial);
                if (enumHandle != IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
                    return;
    
                cacheEntryInfoBufferSize = cacheEntryInfoBufferSizeInitial;
                cacheEntryInfoBuffer = Marshal.AllocHGlobal(cacheEntryInfoBufferSize);
                enumHandle = FindFirstUrlCacheEntry(null, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);
    
                while(true)
                {
                    internetCacheEntry = (INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(cacheEntryInfoBuffer, typeof(INTERNET_CACHE_ENTRY_INFOA));		
    
                    cacheEntryInfoBufferSizeInitial = cacheEntryInfoBufferSize;
                    returnValue = DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);				
                    if (!returnValue)
                    {	
                        returnValue = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);
                    }
                    if (!returnValue && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())
                    {
                        break;
                    }			
                    if (!returnValue && cacheEntryInfoBufferSizeInitial > cacheEntryInfoBufferSize)
                    {
                        cacheEntryInfoBufferSize = cacheEntryInfoBufferSizeInitial;
                        cacheEntryInfoBuffer = Marshal.ReAllocHGlobal(cacheEntryInfoBuffer, (IntPtr) cacheEntryInfoBufferSize);
                        returnValue = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);					
                    }
                }
                Marshal.FreeHGlobal(cacheEntryInfoBuffer);		
            }
        }
    }
    					
  5. プロジェクトをコンパイルして実行します。
  6. キャッシュ内のインターネット一時ファイルが削除されたことを確認するには、Microsoft Internet Explorer で次の手順を実行します。
    1. [ツール] メニューの [インターネット オプション] をクリックします。
    2. [全般] タブで [インターネット一時ファイル] の [設定] をクリックします。
    3. [ファイルの表示] をクリックします。Internet Explorer キャッシュ内のすべてのファイルが削除されていることを確認します。

関連情報

この資料のサンプル コードでは、Visual Studio .NET ランタイムの一部である Interop 名前空間を使用しています。詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
アンマネージ コードとの相互運用
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconinteroperatingwithunmanagedcode.asp (http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconinteroperatingwithunmanagedcode.asp)
Microsoft .NET 開発の詳細については、次の MSDN Web サイトを参照してください。
.NET 開発
http://www.microsoft.com/japan/msdn/netframework/ (http://www.microsoft.com/japan/msdn/netframework/)
WinInet キャッシュ関数の構文の詳細については、次の MSDN Web サイトを参照してください。
キャッシュ
http://msdn2.microsoft.com/en-us/library/ms965968.aspx (http://msdn2.microsoft.com/en-us/library/ms965968.aspx)
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
262110? (http://support.microsoft.com/kb/262110/ ) [HOWTO] WebBrowser コントロールをホストするアプリケーションからキャッシュをクリアする方法
Microsoft Internet Explorer 用の Web ベースのソリューション開発の詳細については、以下のマイクロソフト Web サイトを参照してください。
http://www.microsoft.com/japan/msdn/ie/ (http://www.microsoft.com/japan/msdn/ie/)

http://support.microsoft.com/iep (http://support.microsoft.com/iep)

この資料は以下の製品について記述したものです。
  • Microsoft Visual C# .NET 2002 Standard Edition
キーワード:?
kbhowto kbhowtomaster kbcaching kbwebbrowser kbcominterop kbwininet KB326201
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
 

サポート技術情報の翻訳