【问题标题】:Deleting image is blocked by another process [duplicate]删除图像被另一个进程阻止[重复]
【发布时间】:2017-08-14 06:11:54
【问题描述】:

我有一个 WPF 应用程序,它连续显示来自 ObservableCollection 的图像(包括带有图像路径的字符串)

<Image Source="{Binding ListOfUnsortedImages[0], UpdateSourceTrigger=PropertyChanged}" />

这是包含图片路径的集合:

private ObservableCollection<String> _listOfUnsortedImages = new ObservableCollection<String>();

应用程序显示图像,单击按钮后,应用程序复制图像,将其从集合中删除并显示下一个图像。

这是按钮的简化逻辑:

Image img;
var currentImage = ListOfUnsortedImages[0];

using (Stream stream = File.OpenRead(currentImage))
{
    img = System.Drawing.Image.FromStream(stream);

    // Do something with the image
    img.Dispose();
    stream.Dispose();
}

ListOfUnsortedImages.RemoveAt(0);
File.Delete(currentImage);

最后一行触发 IOException:

进程无法访问文件“文件名”,因为它正在被使用 由另一个进程

我尝试使用Dispose() 和/或using{} 来解决此问题,但没有成功。

【问题讨论】:

  • 如果你跳过使用块,你可以删除文件吗?然后你就会知道问题是否在这个块内
  • 如何将源代码放在路径下?可能不会被复制发布,所以你可以阅读,但不能删除?舒尔,没有进程使用源,而只有您的应用程序?
  • 如果您不想更改代码 - 您可以创建转换器,该转换器将使用 BitmapCacheOption.OnLoad 从字符串创建 BitmapImage

标签: c# .net wpf image stream


【解决方案1】:

问题可能不在您的代码中,因为锁定是由另一个进程引起的。您是否尝试过使用文件管理器删除文件以查看在应用程序未运行时它是否仍处于锁定状态?或者尝试放弃 FileStream 并改用 System.Drawing.Image.FromFile(),因为您的 ObservableCollection 中无论如何都有文件名,请参阅 MSDN

【讨论】:

  • 是的,我尝试通过文件管理器删除图像,但这里出现了同样的问题。我也试过不使用 FileStream,只使用你的建议,还是一样的问题。
  • 也许你会找到方法来识别哪些进程正在阻止你的文件:stackoverflow.com/q/317071/5358389
  • 我也 Clear();删除文件之前的集合,但它也不起作用。 @daniell89 如果我尝试通过文件管理器删除文件,它会告诉我阻塞进程是 vshost32.exe
  • 尝试在没有调试器的情况下运行应用程序(CTRL + F5)
  • 现在,应用崩溃了(我的测试代码不在try catch中,所以这里也是同样的问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多