4

在我的列表视图中,我显示某个文件夹中小图像的缩略图。我将列表视图设置如下:

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

用户可以右键单击列表视图中的图像以将其删除。我从列表视图中删除它,然后我想从文件夹中删除这个图像。现在我得到文件正在使用的错误。当然这是合乎逻辑的,因为图像列表正在使用该文件。

我试图首先从图像列表中删除图像,但我一直保持文件锁定。

有人可以告诉我我做错了什么吗?

谢谢!

4

3 回答 3

6

您需要将文件加载到 MemoryStream 中,如下所示:

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

这样,文件只会被读取一次,并且不会保持锁定状态。

编辑

您正在将图像加载到 ImageList 中。
由于 ImageList 会复制其图像,因此您应该立即处理原件,如下所示:

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);
于 2010-04-21T19:51:28.507 回答
1

在解锁文件之前,需要处理该图像。Dispose从图像列表中删除图像对象后,尝试调用它。

只要你有对图像对象的引用并且 GC 没有收集它,它就会保持锁定。调用Dispose应该强制它放弃它的句柄并导致文件被解锁。

在执行此操作之前,您还必须确保应用程序没有CopyHandle或以其他方式获得对图像资源的第二次引用。

于 2010-04-21T19:49:43.167 回答
1

使用GetThumbnailImage然后处理图像:

var image = Image.FromFile(fileN);

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

imageList1.Images.Add(imgThumb);

image.Dispose();

listView1.LargeImageList = imageList1;

现在您可以删除该文件:

File.Delete(FileN);
于 2015-05-15T13:21:24.310 回答