Pregunta

En mi listview muestro imágenes en miniatura de pequeñas imágenes en una carpeta determinada. I fijó la vista de lista de la siguiente manera:

var imageList = new ImageList();
foreach (var fileInfo in dir.GetFiles())
{
    try
    {
        var image = Image.FromFile(fileInfo.FullName);
        imageList.Images.Add(image);
    }
    catch
    {
        Console.WriteLine("error");
    }
}

listView.View = View.LargeIcon;
imageList.ImageSize = new Size(64, 64);
listView.LargeImageList = imageList;

for (int j = 0; j < imageList.Images.Count; j++)
{
    var item = new ListViewItem {ImageIndex = j, Text = "blabla"};
    listView.Items.Add(item);
}

El usuario puede rightclick en una imagen en la vista de lista para eliminarlo. Me quitarlo de la vista de lista y luego quiero borrar esta imagen de la carpeta. Ahora me sale el error de que el archivo está en uso. Por supuesto, esto es lógico ya que la lista de imágenes está utilizando el archivo.

He intentado quitar primero la imagen de la lista de imágenes, pero sigo teniendo el bloqueo de archivo.

Puede alguien decirme lo que estoy haciendo mal?

Gracias!

¿Fue útil?

Solución

Es necesario cargar el archivo en un MemoryStream, como esto:

var image = Image.FromStream(new MemoryStream(File.ReadAllBytes(fileInfo.FullName)));

De esta manera, el archivo sólo se lee una vez, y no permanecerá bloqueado.

editar

va a cargar las imágenes en un ImageList.
Desde el ImageList hace copias de sus imágenes, simplemente debe disponer los originales de inmediato, así:

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);

Otros consejos

tendrá que ser eliminados antes de que se desbloqueará el archivo de la imagen. Trate de llamar a Dispose en el objeto de imagen después de sacarlo de la lista de imágenes.

Siempre y cuando usted tiene una referencia al objeto de la imagen y la GC no ha recogido él, que se mantendrá la cerradura. Llamando Dispose debería forzarlo a renunciar a su asa y hacer que el archivo que ser desbloqueados.

También tiene que asegurarse de que la aplicación no hizo CopyHandle o bien tener una segunda referencia al recurso de imagen antes de hacer esto.

Uso GetThumbnailImage y luego deshacerse de imagen:

var image = Image.FromFile(fileN);

Image imgThumb = image.GetThumbnailImage(100, 100, null, new IntPtr());

imageList1.Images.Add(imgThumb);

image.Dispose();

listView1.LargeImageList = imageList1;

Ahora se puede eliminar el archivo:

File.Delete(FileN);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top