在我的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);
}

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

我试图首先从图像符中删除图像,但是我继续拥有文件锁定。

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

谢谢!

有帮助吗?

解决方案

您需要将文件加载到Memorystream中,这样:

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

这样,该文件只会被读取一次,并且不会锁定。

编辑

您正在将图像加载到成像主义者中。
由于成像主义者制作其图像的副本,因此您应该立即将原件放置,例如:

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

其他提示

图像将需要在解锁文件之前处置图像。尝试打电话 Dispose 从图像对象中删除图像列表后,在图像对象上。

只要您对图像对象有参考,并且GC尚未收集它,它将保持锁定。打电话 Dispose 应该强迫它放弃其手柄并导致文件解锁。

您还必须确保该应用没有 CopyHandle 或否则,在执行此操作之前,请再次参考图像资源。

采用 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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top