Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

391
Views
Icono de carpeta precargado para una carpeta específica en la caché de iconos de Windows, en C# o VB.NET

Necesito mencionar un programa de terceros, o mejor dicho, el código fuente del programa WinThumbsPreloader , que contiene todo el código necesario escrito en C# para precargar la miniatura de un archivo en la caché de miniaturas de Windows, como puede ver en esta demostración:

ingrese la descripción de la imagen aquí

El problema es que lo que necesito precargar es el icono de una carpeta, pero el método IThumbnailCache::GetThumbnail no permite pasar un elemento de carpeta, y me devolverá el código de error 0x8004B200 ( WTS_E_FAILEDEXTRACTION ):

El elemento Shell no admite la extracción de miniaturas. Por ejemplo, elementos .exe o .lnk.

En otras palabras, necesito hacer lo mismo que hace el programa WinThumbsPreloader , pero para íconos de carpetas en lugar de miniaturas de carpetas/íconos.

Entonces, lo que quiero decir es que tengo una carpeta con un archivo desktop.ini dentro, que como probablemente sepas, puede servir para reemplazar el icono/miniatura predeterminado de la carpeta que almacena ese archivo desktop.ini . Un ejemplo del contenido del archivo desktop.ini :

 [.ShellClassInfo] IconResource=FolderPreview.ico,0

La razón por la que necesito precargar carpetas es para evitar la generación de caché de iconos cada vez que navego por una carpeta.

Para despejar dudas, me gustaría evitar esta lenta generación de iconos de carpetas:

antes de

Y en su lugar, obtén esta velocidad mejorada:

después

Mi pregunta es: en C# o VB.NET, ¿cómo puedo precargar mediante programación el ícono de una carpeta específica en el caché de íconos de Windows?

Parece que la interfaz IThumbnailCache no es el camino a seguir para este problema...


ACTUALIZAR 1

Siguiendo las sugerencias de comentarios de @Jimi, este es el enfoque que estoy intentando:

 Public Shared Sub PreloadInIconCache(path As String, Optional iconSize As Integer = 256) Dim iIdIShellItem As New Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe") Dim shellItem As IShellItem = Nothing Dim shellItemIF As IShellItemImageFactory Dim iconFlags As IShellItemImageFactoryGetImageFlags = IShellItemImageFactoryGetImageFlags.IconOnly SHCreateItemFromParsingName(path, IntPtr.Zero, iIdIShellItem, shellItem) shellItemIF = DirectCast(shellItem, IShellItemImageFactory) shellItemIF.GetImage(New NativeSize(iconSize, iconSize), iconFlags, Nothing) Marshal.ReleaseComObject(shellItemIF) Marshal.ReleaseComObject(shellItem) shellItemIF = Nothing shellItem = Nothing End Sub

Guarda en caché los iconos. Si llamo a este método para, digamos, un directorio que contiene 1000 subcarpetas con íconos personalizados, entonces el tamaño de iconcache_256.db aumenta alrededor de 250 MB, por lo que es una clara evidencia de que los íconos se almacenan en caché, sin embargo, estoy haciendo algo mal porque el sistema operativo no utiliza esos iconos almacenados en caché. Quiero decir, si después de llamar a ese método y luego uso manualmente Explorer.exe para navegar a ese directorio, el sistema operativo comienza nuevamente a extraer y almacenar en caché los íconos para todas las 1000 subcarpetas creando NUEVAS referencias de íconos, por lo que iconcache_256.db duplica su archivo tamaño a alrededor de 500 MB, y esto es una evidencia de que iconcache_256.db contiene tanto los íconos que almacené en caché usando el método anterior, como los íconos almacenados en caché por el propio sistema operativo, por lo que las referencias de caché de íconos que genero llamando al método anterior difieren en de alguna manera de las referencias de caché de iconos generadas por el propio sistema operativo, y eso es lo que estoy haciendo mal ...

¿Qué estoy haciendo mal?.

ACTUALIZAR 2

Al usar la biblioteca WindowsAPICodePack v1.1 (del administrador de Nuget), tengo el mismo problema que se describe en el código de la ACTUALIZACIÓN 1 usando IShellItemImageFactory.GetImage : puedo extraer los íconos y los íconos se almacenan en caché en el archivo iconcache_256.db (y otros Los archivos *.db también tienen menos tamaño de caché), pero si navego al directorio a través de Explorer.exe, el sistema operativo comienza a extraer y almacenar en caché nuevamente el icono de las mismas carpetas que ya guardé en caché...

Ejemplo de código completo:

 Imports Microsoft.WindowsAPICodePack.Shell ... Dim directoryPath As String = "C:\Directory" Dim searchPattern As String = "*" Dim searchOption As SearchOption = SearchOption.AllDirectories For Each dir As DirectoryInfo In New DirectoryInfo(directoryPath).EnumerateDirectories(searchPattern, searchOption) Console.WriteLine($"Extracting icon for directory: '{dir.FullName}'") Using folder As ShellFolder = DirectCast(ShellFolder.FromParsingName(dir.FullName), ShellFolder) folder.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly folder.Thumbnail.RetrievalOption = ShellThumbnailRetrievalOption.Default Using ico As Bitmap = folder.Thumbnail.Bitmap ' Or: folder.Thumbnail.Icon ' PictureBox1.Image = ico ' PictureBox1.Update() ' Thread.Sleep(50) End Using End Using Next dir

No estoy seguro de por qué el sistema operativo insiste en extraer nuevos íconos y almacenarlos en caché cuando ya los guardé en caché, esto multiplica x2 las referencias de íconos en caché en iconcache_256.db (y en los otros archivos *.db), porque si itero 1000 subcarpetas de un directorio para extraer y almacenar en caché sus íconos, si después de hacer eso navego a esa carpeta a través de Explorer.exe, entonces el sistema operativo extraerá y almacenará en caché nuevamente esos 1.000 íconos de subcarpetas creando NUEVAS entradas en iconcache_256.db (y en el otro * archivos .db).

No sé cómo leer el formato de la base de datos del archivo iconcache_256.db , por lo que no conozco el formato de la estructura, pero si la estructura toma una ruta de directorio como uno de sus campos, entonces sospecho que los enfoques de código que usé quizás fuerzan para agregar un campo de ruta de directorio que difiere de lo que agrega el sistema operativo en el campo de caché de íconos cuando navego a la carpeta para almacenar íconos a través de Explorer.exe, y tal vez por eso las referencias de caché de íconos se multiplican x2 ... solo yo estoy especulando...

ACTUALIZAR 3

Pensé que tal vez el problema real podría ser que las referencias agregadas en los archivos *.db de caché de íconos quizás sean por proceso y, por esa razón, cuando navego al directorio con Explorer.exe, comienza a extraer y almacenar en caché nuevamente los íconos que ya tenía. extraído y almacenado en caché al depurar mi ejecutable en Visual Studio...

Así que hice una prueba ejecutando el mismo código para extraer/almacenar en caché los íconos de las carpetas de dos procesos diferentes simplemente creando el mismo proyecto en dos ejecutables con diferentes nombres y diferentes guías de ensamblaje. Descubrí que las referencias de caché de iconos en los archivos *.db NO se multiplican/duplican cuando ejecuto el segundo ejecutable, por lo que se descarta la idea por proceso.

Realmente no sé qué más puedo probar... y qué es lo que difiere en las referencias "duplicadas" dentro de los archivos de caché de iconos *.db.

over 4 years ago · Santiago Trujillo
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!