Frage

In meinem Listview zeigen wir Thumbnails von kleinen Bildern in einem bestimmten Ordner. Ich Setup die Listenansicht wie folgt:

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);
}

Der Benutzer kann auf ein Bild in der Listenansicht der rechten Maustaste um es zu entfernen. Ich entferne sie aus der Listenansicht und dann will ich dieses Bild aus dem Ordner löschen. Jetzt erhalte ich die Fehlermeldung, dass die Datei in Gebrauch ist. Dies ist natürlich logisch, da die Bildliste der Datei verwendet.

Ich habe versucht, zuerst das Bild aus der Bildliste zu entfernen, aber ich halte auf die Dateisperre haben.

Kann jemand mir sagen, was ich falsch mache?

Danke!

War es hilfreich?

Lösung

Sie müssen die Datei in einen Memorystream, wie diese laden:

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

Auf diese Weise wird die Datei nur einmal gelesen werden, und bleibt nicht gesperrt.

EDIT

Sie ist Laden der Bilder in eine Abbildungsliste.
Da die Abbildungsliste Kopien seiner Bilder macht, sollten Sie einfach die Originale verfügen sofort, wie folgt aus:

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

Andere Tipps

Das Bild muß entsorgt werden, bevor es die Datei entsperrt. Versuchen Sie fordern Dispose auf das Bild, Objekt, nachdem Sie es aus der Bilderliste entfernen.

So lange, wie Sie einen Verweis auf das Bildobjekt haben und die GC hat es nicht erfasst, es wird die Sperre zu halten. Der Aufruf Dispose sollte es zwingen, seinen Griff zu geben und führen Sie die Datei freigeschaltet werden.

Sie müssen auch sicherstellen, dass der App nicht tat CopyHandle oder sonst einen zweiten Verweis auf die Bildressource, bevor dies zu tun.

Verwenden GetThumbnailImage und dann dispose Bild:

var image = Image.FromFile(fileN);

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

imageList1.Images.Add(imgThumb);

image.Dispose();

listView1.LargeImageList = imageList1;

Nun können Sie die Datei löschen:

File.Delete(FileN);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top