【问题标题】:Cannot delete an image file that is shown in a listview无法删除列表视图中显示的图像文件
【发布时间】:2011-02-10 18:42:04
【问题描述】:

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

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

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

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

谁能告诉我我做错了什么?

谢谢!

【问题讨论】:

    标签: c# .net winforms listview filelock


    【解决方案1】:

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

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

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

    编辑

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

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

    【讨论】:

    • @Enrico:这非常浪费机器资源。将 image.Dispose() 添加到 ImageList 后,您只是忘记调用它。
    • @Hans:ImageList 会复制图像吗?
    • 它克隆位图以匹配 ImageList 的大小和颜色深度。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      使用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);
      

      【讨论】:

        猜你喜欢
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        相关资源
        最近更新 更多