WPF无法从代码中删除图像.IOException

本文关键字:删除 图像 IOException 代码 WPF | 更新日期: 2023-09-27 18:14:46

我可能读了所有关于这个的帖子。似乎找不到问题所在。这是我的收藏

private ObservableCollection<BitmapImage> _imageList = new ObservableCollection<BitmapImage>();

这是我加载图像的方式

foreach (string filepath in temp) //populate image collection 
{
    BitmapImage tempImg = new BitmapImage();
    tempImg.BeginInit();
    tempImg.CacheOption = BitmapCacheOption.OnLoad;
    tempImg.UriSource = new Uri(filepath);
    tempImg.EndInit();
    _imageList.Add(tempImg); 
}

当我试图删除时,异常发生在行,文件正在使用中。

if (File.Exists(_imageList[SelectedItem].UriSource.AbsolutePath.ToString()))
{
    int temp = SelectedItem;
    //_imageList.RemoveAt(temp);
    Console.WriteLine(_imageList[temp].UriSource.AbsolutePath.ToString());
    File.Delete(_imageList[temp].UriSource.AbsolutePath.ToString());
}

例外:

System.IO类型的异常。在mscorlib.dll中发生IOException,但未在用户代码中处理。

附加信息:进程无法访问文件'e:'pix'img.jpg',因为它正在被其他进程使用。

谁能重新打开它?我找出了问题,它不是这个代码,它是在视图的部分,我想张贴一个答案。

WPF无法从代码中删除图像.IOException

从列表中删除临时的第th项,然后立即重用它。如果列表中有足够的项,就会删除错误的文件。否则你会得到一个IndexOutOfRangeException。

此外,UriSource。AbsolutePath是一个字符串,那么使用ToString()就没有意义了。

从发布的代码中无法看出为什么文件可能正在使用。请检查是否有其他应用程序(或者您在其他地方)保持文件打开。

但是这个异常说了什么呢?它在哪一行代码中被触发?我敢打赌,你的BitmapImage持有文件,这就是为什么你不能删除它,你应该首先处理它。

有时WPF只是保存文件,在这种情况下,最好只是存储文件中的字节,而不去管它,比如:

  private BitmapImage loadImage(string imgPath)
    {
        BitmapImage myRetVal = null;
        if (imgPath != null)
        {
            BitmapImage img = new BitmapImage();
            using (FileStream stream = File.OpenRead(imgPath))
            {
                img.BeginInit();
                img.CacheOption = BitmapCacheOption.OnLoad;
                img.StreamSource = stream;
                img.EndInit();
            }
            myRetVal = image;
        }
        return myRetVal;
    }