WPF无法从代码中删除图像。 IOException异常

时间:2015-09-28 12:10:44

标签: c# wpf image ioexception

我可能已经阅读了有关此内容的所有帖子。似乎无法找到问题。 这是我的收藏品

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

例外:

mscorlib.dll中出现“System.IO.IOException”类型的异常,但未在用户代码中处理。

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

有人可以重新打开吗?我想出了问题,并不是这个代码,它是在View的部分,我想发一个答案。

2 个答案:

答案 0 :(得分:0)

但例外是什么?它被解雇的代码行? 我敢打赌,你的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;
    }

答案 1 :(得分:0)

您从列表中删除了临时项目,然后立即重复使用它。鉴于事实上,列表中有足够的项目,将删除错误的文件。否则,您将获得IndexOutOfRangeException。

此外,UriSource.AbsolutePath是一个字符串,那么使用ToString()毫无意义。

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