在我的listview中,我会在某个文件夹中显示小图像的缩略图。我按如下方式设置了listview:
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);
}
用户可以右键单击列表视图中的图像以将其删除。我从列表视图中删除它,然后我想从文件夹中删除此图像。现在我收到文件正在使用的错误。当然这是合乎逻辑的,因为图像列表正在使用该文件。
我尝试先从图像列表中删除图像,但我继续保持文件锁定。
有人可以告诉我我做错了吗?
谢谢!
答案 0 :(得分: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);
答案 1 :(得分:1)
在解锁文件之前,需要处理图像。从图像列表中删除后,尝试在图像对象上调用Dispose
。
只要你有对图像对象的引用并且GC没有收集它,它就会保持锁定。调用Dispose
会强制它放弃其句柄并导致文件解锁。
在执行此操作之前,您还必须确保应用程序没有CopyHandle
或以其他方式获得对图像资源的第二次引用。
答案 2 :(得分:0)
使用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);