Ejemplo n.º 1
0
        private static void ForEachCacheEntry(long groupId, string searchPattern, int flags, CacheEntryAction action)
        {
            int    cacheEntryInfoBufferSize = 0;
            IntPtr cacheEntryInfoBuffer     = IntPtr.Zero;

            IntPtr enumHandle = IntPtr.Zero;

            try
            {
                for (;;)
                {
                    enumHandle = FindFirstUrlCacheEntryEx(searchPattern, 0, flags,
                                                          groupId, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSize, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                    int err = Marshal.GetLastWin32Error();

                    if (enumHandle != IntPtr.Zero)
                    {
                        break;
                    }

                    if (err == ERROR_NO_MORE_ITEMS || err == ERROR_FILE_NOT_FOUND)
                    {
                        return;
                    }
                    if (err != ERROR_INSUFFICIENT_BUFFER)
                    {
                        ThrowExceptionForLastWin32Error();
                    }

                    cacheEntryInfoBuffer = Marshal.ReAllocCoTaskMem(cacheEntryInfoBuffer, cacheEntryInfoBufferSize);
                }

                for (;;)
                {
                    INTERNET_CACHE_ENTRY_INFO entry = (INTERNET_CACHE_ENTRY_INFO)
                                                      Marshal.PtrToStructure(cacheEntryInfoBuffer, typeof(INTERNET_CACHE_ENTRY_INFO));

                    action(entry);

                    // Get next entry.
                    bool returnValue = FindNextUrlCacheEntryEx(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSize,
                                                               IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                    int err = Marshal.GetLastWin32Error();

                    if (!returnValue)
                    {
                        if (err == ERROR_NO_MORE_ITEMS || err == ERROR_FILE_NOT_FOUND)
                        {
                            return;
                        }
                        if (err != ERROR_INSUFFICIENT_BUFFER)
                        {
                            ThrowExceptionForLastWin32Error();
                        }

                        cacheEntryInfoBuffer = Marshal.ReAllocCoTaskMem(cacheEntryInfoBuffer, cacheEntryInfoBufferSize);
                    }
                }
            }
            finally
            {
                Marshal.FreeCoTaskMem(cacheEntryInfoBuffer);

                if (enumHandle != IntPtr.Zero)
                {
                    FindCloseUrlCache(enumHandle);
                }
            }
        }
Ejemplo n.º 2
0
        private static void ForEachCacheEntry(long groupId, string searchPattern, int flags, CacheEntryAction action)
        {
            int cacheEntryInfoBufferSize = 0;
            IntPtr cacheEntryInfoBuffer = IntPtr.Zero;

            IntPtr enumHandle = IntPtr.Zero;
            try
            {
                for (;;)
                {
                    enumHandle = FindFirstUrlCacheEntryEx(searchPattern, 0, flags,
                        groupId, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSize, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                    int err = Marshal.GetLastWin32Error();

                    if (enumHandle != IntPtr.Zero)
                        break;

                    if (err == ERROR_NO_MORE_ITEMS || err == ERROR_FILE_NOT_FOUND)
                        return;
                    if (err != ERROR_INSUFFICIENT_BUFFER)
                        ThrowExceptionForLastWin32Error();

                    cacheEntryInfoBuffer = Marshal.ReAllocCoTaskMem(cacheEntryInfoBuffer, cacheEntryInfoBufferSize);
                }

                for (;;)
                {
                    INTERNET_CACHE_ENTRY_INFO entry = (INTERNET_CACHE_ENTRY_INFO)
                        Marshal.PtrToStructure(cacheEntryInfoBuffer, typeof (INTERNET_CACHE_ENTRY_INFO));

                    action(entry);

                    // Get next entry.
                    bool returnValue = FindNextUrlCacheEntryEx(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSize,
                        IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                    int err = Marshal.GetLastWin32Error();

                    if (!returnValue)
                    {
                        if (err == ERROR_NO_MORE_ITEMS || err == ERROR_FILE_NOT_FOUND)
                            return;
                        if (err != ERROR_INSUFFICIENT_BUFFER)
                            ThrowExceptionForLastWin32Error();

                        cacheEntryInfoBuffer = Marshal.ReAllocCoTaskMem(cacheEntryInfoBuffer, cacheEntryInfoBufferSize);
                    }
                }
            }
            finally
            {
                Marshal.FreeCoTaskMem(cacheEntryInfoBuffer);

                if (enumHandle != IntPtr.Zero)
                    FindCloseUrlCache(enumHandle);
            }
        }