Question

Dans mon listview je montre les vignettes des petites images dans un dossier. configuration I ListView comme suit:

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

L'utilisateur peut rightclick sur une image dans le listview pour le retirer. Je le supprimer de la listview et je veux supprimer cette image du dossier. Maintenant, je reçois l'erreur que le fichier est utilisé. Bien sûr, cela est logique puisque le imagelist utilise le fichier.

J'ai essayé d'enlever d'abord l'image de la liste d'images, mais je continue à avoir le verrouillage du fichier.

Quelqu'un peut-il me dire ce que je fais mal?

Merci!

Était-ce utile?

La solution

Vous devez charger le fichier dans un MemoryStream, comme ceci:

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

De cette façon, le fichier ne sera lu qu'une seule fois et ne pas rester bloqué.

EDIT

Vous chargez les images dans un ImageList.
Étant donné que le ImageList fait des copies de ses images, il vous suffit de disposer les originaux tout de suite, comme ceci:

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

Autres conseils

L'image devra être éliminé avant qu'il déverrouiller le fichier. Essayez d'appeler Dispose sur l'objet d'image après l'avoir retirée de la liste d'images.

Tant que vous avez une référence à l'objet d'image et le GC n'a pas recueilli, il gardera le verrou. L'appel Dispose devrait le forcer à renoncer à sa poignée et provoquer le fichier à déverrouiller.

Vous devez également vous assurer que l'application n'a pas CopyHandle ou autrement obtenir une deuxième référence à la ressource d'image avant de le faire.

Utilisez GetThumbnailImage puis l'image Éliminez:

var image = Image.FromFile(fileN);

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

imageList1.Images.Add(imgThumb);

image.Dispose();

listView1.LargeImageList = imageList1;

Maintenant, vous pouvez supprimer le fichier:

File.Delete(FileN);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top