C# 删除其他进程使用的文件

C# 删除其他进程使用的文件,c#,wpf,process,C#,Wpf,Process,我正在尝试创建一个C应用程序,它加载一个powerpoint,并使每张幻灯片成为一个JPG,存储在位图图像列表中。用户应该能够加载另一个powerpoint,加载时会删除文件夹中的每个其他JPG。目前,我无法删除JPG,因为它们正被另一个进程使用,而这个进程恰好就是这个应用程序。我怎样才能解决这个问题 foreach (ISlide slide in presentation.Slides) { System.IO.Stream imageStream = slide.

我正在尝试创建一个C应用程序,它加载一个powerpoint,并使每张幻灯片成为一个JPG,存储在位图图像列表中。用户应该能够加载另一个powerpoint,加载时会删除文件夹中的每个其他JPG。目前,我无法删除JPG,因为它们正被另一个进程使用,而这个进程恰好就是这个应用程序。我怎样才能解决这个问题

foreach (ISlide slide in presentation.Slides)
{
             System.IO.Stream imageStream = slide.ConvertToImage(Syncfusion.Drawing.ImageFormat.Jpeg);
             System.Drawing.Image convertedImage = System.Drawing.Image.FromStream(imageStream);

             if (!System.IO.File.Exists(picsPath + "\\Slide_" + slide.SlideNumber + ".jpg"))
                  convertedImage.Save(picsPath + "\\Slide_" + slide.SlideNumber + ".jpg");
             else
             {
                        try
                        {
                  System.IO.File.Delete(picsPath + "\\Slide_" + slide.SlideNumber + ".jpg");               
                  convertedImage.Save(picsPath + "\\Slide_" + slide.SlideNumber + ".jpg");
             }
                  catch (Exception df){Console.WriteLine(df.StackTrace);}
             }
             bitmap = new BitmapImage();
             bitmap.BeginInit();
             bitmap.UriSource = new Uri(picsPath + "\\Slide_" + slide.SlideNumber + ".jpg");
             bitmap.CacheOption = BitmapCacheOption.OnLoad;
             bitmap.EndInit();
             VisualAidPPT.Add(bitmap);
             convertedImage = null;
}

您根本不需要编写任何图像文件

只需直接使用slide.ConvertToImage返回的流来加载BitmapImage:

foreach (var slide in presentation.Slides)
{
    var bitmap = new BitmapImage();

    using (var imageStream = slide.ConvertToImage(Syncfusion.Drawing.ImageFormat.Jpeg))
    {
        imageStream.Position = 0;

        bitmap.BeginInit();
        bitmap.StreamSource = imageStream;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.EndInit();
    }

    VisualAidPPT.Add(bitmap);
}
编辑:如果上述操作不起作用,您仍然可以解码System.Drawing.Image并将其保存到MemoryStream:

foreach (var slide in presentation.Slides)
{
    var bitmap = new BitmapImage();

    using (var imageStream = slide.ConvertToImage(Syncfusion.Drawing.ImageFormat.Jpeg))
    using (var image = System.Drawing.Image.FromStream(imageStream))
    using (var memoryStream = new MemoryStream())
    {
        image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        memoryStream.Position = 0;

        bitmap.BeginInit();
        bitmap.StreamSource = memoryStream;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.EndInit();
    }

    VisualAidPPT.Add(bitmap);
}

这是因为jpg文件被您对其执行的上一个操作锁定。使用.Dispose释放文件handler您可以使用sysinternals中的handle.exe,它为您提供使用指定文件的进程。您可以分析其输出并终止该进程,然后可以删除文件。为什么要使用System.Drawing.Image.FromStream(WinForms),而不是通过将imageStream分配给其StreamSource属性直接加载BitmapImage?似乎根本不需要保存JPEG文件。谢谢大家的帮助。现在,当我显示一个新的ppt时,前几张幻灯片仍然显示上次加载的ppt,但最后几张来自新的更新ppt。检查文件夹中的文件,所有文件都是新更新的文件。有人知道这是为什么吗?@Clemens我使用了StreamSource属性,但是当我没有将URI源设置到文件的位置时,会引发异常。我正在获取一个异常系统。NotSupportedException:找不到适合完成此操作的成像组件。是否将位置设置为0?请参阅编辑后的答案。它在加载BitmapImage之前将图像流复制到MemoryStream;找不到该组件。能否尝试使用Syncfusion.Drawing.ImageFormat.Jpeg以外的其他格式?例如巴布亚新几内亚?