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