none
ELIMINAR TEMPORALES INTERNET EXPLORER C# RRS feed

  • Pregunta

  • Buenas a todos,

    Estoy intentando hacer una aplicación que me borre los temporales de internet explorer automáticamente, y tengo ésta parte de código: 

    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(rutaINetCache);  

    while (di.GetFiles().Length != 0 && di.GetDirectories().Length != 0)
                    {
                        foreach(System.IO.FileInfo file in di.GetFiles())
                        {
                            file.Delete();
                        }

                        foreach(System.IO.DirectoryInfo dir in di.GetDirectories())
                        {
                            dir.Delete();
                        }
                    }

    El problema que tengo, es que me borra solamente los que no están en uso, pero si por ejemplo tengo 100 archivos temporales me elimina 5 por ejemplo, pero en cambio si entro al navegador y los elimino manualmente, me los elimina casi todos, alguien sabría decirme como hacer para que me los elimine automáticamente como si los hiciera manual? Gracias de Antemano.

    lunes, 22 de enero de 2018 13:58

Respuestas

  • No entiendo como te pudo haber funcionado eso. No existen tales cosas como archivos en la caché del ie. No accedes a través del filesystem. Se trata de un storage.

    El propio ie te da los recursos para hacerlo, vía las funciones de wininet. Por ejemplo

    using System.Runtime.InteropServices;
    
    //
    [DllImport("wininet")]
    static extern IntPtr FindFirstUrlCacheEntry(string lpszUrlSearchPattern,  IntPtr lpFirstCacheEntryInfo, ref int lpcbCacheEntryInfo);
    [DllImport("wininet")]
    static extern bool FindNextUrlCacheEntry(IntPtr hEnumHandle, IntPtr lpNextCacheEntryInfo, ref int lpcbCacheEntryInfo);
    [DllImport("wininet")]
    static extern bool DeleteUrlCacheEntry(string lpszUrlName);
    [DllImport("wininet")]
    static extern bool FindCloseUrlCache(IntPtr hEnumHandle);
    
    [StructLayout(LayoutKind.Sequential)]
    struct LPINTERNET_CACHE_ENTRY_INFO
    {
    	public int dwStructSize;
    	public IntPtr lpszSourceUrlName;
    	public IntPtr lpszLocalFileName;
    	public int CacheEntryType;
    	public int dwUseCount;
    	public int dwHitRate;
    	public int dwSizeLow;
    	public int dwSizeHigh;
    	public FILETIME LastModifiedTime;
    	public FILETIME ExpireTime;
    	public FILETIME LastAccessTime;
    	public FILETIME LastSyncTime;
    	public IntPtr lpHeaderInfo;
    	public int dwHeaderInfoSize;
    	public IntPtr lpszFileExtension;
    	public int dwReserved;
    };
    
    [StructLayout(LayoutKind.Sequential)]
    struct FILETIME
    {
    	public int dwLowDateTime;
    	public int dwHighDateTime;
    };
    
    //
    IntPtr entrada = IntPtr.Zero;
    int largo = 0;
    
    // hacemos fallar la función para recuperar el tamaño del búfer
    FindFirstUrlCacheEntry(null, entrada, ref largo);
    
    // instanciamos el búfer
    entrada = Marshal.AllocHGlobal(largo);
    
    // recuperamos el handle del enumerador y la primera entrada en la cache
    // el primer argumento puede ser "cookie:", "visited:" o null
    IntPtr hEnumHandle = FindFirstUrlCacheEntry(null, entrada, ref largo);
    
    // iteramos el contenido de la caché
    do
    {
    	// parseamos la entrada
    	LPINTERNET_CACHE_ENTRY_INFO info = (LPINTERNET_CACHE_ENTRY_INFO)Marshal.PtrToStructure(entrada, typeof(LPINTERNET_CACHE_ENTRY_INFO));
    
    	// borramos la entrada en la caché
    	//MessageBox.Show(Marshal.PtrToStringAnsi(info.lpszSourceUrlName));
    	DeleteUrlCacheEntry(Marshal.PtrToStringAnsi(info.lpszSourceUrlName));
    
    	// tamaño del búfer para la siguiente entrada
    	largo = 0;
    	FindNextUrlCacheEntry(hEnumHandle, IntPtr.Zero, ref largo);
    	entrada = Marshal.ReAllocHGlobal(entrada, (IntPtr)largo);
    }
    while (FindNextUrlCacheEntry(hEnumHandle, entrada, ref largo));
    
    // cerramos el enumerador y eliminamos el búfer
    FindCloseUrlCache(hEnumHandle);
    Marshal.FreeHGlobal(entrada);
    

    • Marcado como respuesta Ismaelm martes, 23 de enero de 2018 10:26
    lunes, 22 de enero de 2018 19:11

Todas las respuestas

  • No entiendo como te pudo haber funcionado eso. No existen tales cosas como archivos en la caché del ie. No accedes a través del filesystem. Se trata de un storage.

    El propio ie te da los recursos para hacerlo, vía las funciones de wininet. Por ejemplo

    using System.Runtime.InteropServices;
    
    //
    [DllImport("wininet")]
    static extern IntPtr FindFirstUrlCacheEntry(string lpszUrlSearchPattern,  IntPtr lpFirstCacheEntryInfo, ref int lpcbCacheEntryInfo);
    [DllImport("wininet")]
    static extern bool FindNextUrlCacheEntry(IntPtr hEnumHandle, IntPtr lpNextCacheEntryInfo, ref int lpcbCacheEntryInfo);
    [DllImport("wininet")]
    static extern bool DeleteUrlCacheEntry(string lpszUrlName);
    [DllImport("wininet")]
    static extern bool FindCloseUrlCache(IntPtr hEnumHandle);
    
    [StructLayout(LayoutKind.Sequential)]
    struct LPINTERNET_CACHE_ENTRY_INFO
    {
    	public int dwStructSize;
    	public IntPtr lpszSourceUrlName;
    	public IntPtr lpszLocalFileName;
    	public int CacheEntryType;
    	public int dwUseCount;
    	public int dwHitRate;
    	public int dwSizeLow;
    	public int dwSizeHigh;
    	public FILETIME LastModifiedTime;
    	public FILETIME ExpireTime;
    	public FILETIME LastAccessTime;
    	public FILETIME LastSyncTime;
    	public IntPtr lpHeaderInfo;
    	public int dwHeaderInfoSize;
    	public IntPtr lpszFileExtension;
    	public int dwReserved;
    };
    
    [StructLayout(LayoutKind.Sequential)]
    struct FILETIME
    {
    	public int dwLowDateTime;
    	public int dwHighDateTime;
    };
    
    //
    IntPtr entrada = IntPtr.Zero;
    int largo = 0;
    
    // hacemos fallar la función para recuperar el tamaño del búfer
    FindFirstUrlCacheEntry(null, entrada, ref largo);
    
    // instanciamos el búfer
    entrada = Marshal.AllocHGlobal(largo);
    
    // recuperamos el handle del enumerador y la primera entrada en la cache
    // el primer argumento puede ser "cookie:", "visited:" o null
    IntPtr hEnumHandle = FindFirstUrlCacheEntry(null, entrada, ref largo);
    
    // iteramos el contenido de la caché
    do
    {
    	// parseamos la entrada
    	LPINTERNET_CACHE_ENTRY_INFO info = (LPINTERNET_CACHE_ENTRY_INFO)Marshal.PtrToStructure(entrada, typeof(LPINTERNET_CACHE_ENTRY_INFO));
    
    	// borramos la entrada en la caché
    	//MessageBox.Show(Marshal.PtrToStringAnsi(info.lpszSourceUrlName));
    	DeleteUrlCacheEntry(Marshal.PtrToStringAnsi(info.lpszSourceUrlName));
    
    	// tamaño del búfer para la siguiente entrada
    	largo = 0;
    	FindNextUrlCacheEntry(hEnumHandle, IntPtr.Zero, ref largo);
    	entrada = Marshal.ReAllocHGlobal(entrada, (IntPtr)largo);
    }
    while (FindNextUrlCacheEntry(hEnumHandle, entrada, ref largo));
    
    // cerramos el enumerador y eliminamos el búfer
    FindCloseUrlCache(hEnumHandle);
    Marshal.FreeHGlobal(entrada);
    

    • Marcado como respuesta Ismaelm martes, 23 de enero de 2018 10:26
    lunes, 22 de enero de 2018 19:11
  • Muchas gracias, me ha funcionado a la perfección, me acabas de salvar la aplicación, Saludos!!
    martes, 23 de enero de 2018 10:26