C# 检测PowerPoint何时完成文件保存

C# 检测PowerPoint何时完成文件保存,c#,.net,powerpoint,C#,.net,Powerpoint,在我正在编写的加载项中保存PowerPoint文件时遇到问题 基本上,我需要将当前打开的演示文稿保存为wmv,然后将其FTP到外部服务器。。。听起来很简单吧 我已经解决了如何将当前打开的演示文稿保存为wmv 我还拥有检查文件是否打开的代码,这样我就可以知道“保存”过程何时完成 但代码只是进入一个无限循环。wmv开始写入,但从未超过0kb 如果我拆下这条线 checkfile(exportPath, exportName); 它工作得很好。。。否则它只会停留在一个循环中 这是我到目前为止的代码

在我正在编写的加载项中保存PowerPoint文件时遇到问题

基本上,我需要将当前打开的演示文稿保存为wmv,然后将其FTP到外部服务器。。。听起来很简单吧

我已经解决了如何将当前打开的演示文稿保存为wmv

我还拥有检查文件是否打开的代码,这样我就可以知道“保存”过程何时完成

但代码只是进入一个无限循环。wmv开始写入,但从未超过0kb

如果我拆下这条线

checkfile(exportPath, exportName);
它工作得很好。。。否则它只会停留在一个循环中

这是我到目前为止的代码

using System;
using System.Windows.Forms;
using Office = Microsoft.Office.Core;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using System.IO;

namespace PowerPointAddIn2
{
public partial class LoginPanel : UserControl
{
    public LoginPanel()
    {
        InitializeComponent();
    }

    private void LoginPanel_Load(object sender, EventArgs e)
    {

    }

    private void btnLogin_Click(object sender, EventArgs e)
    {

        string exportName = "video_of_presentation";
        string exportPath = @"C:\{0}.wmv";

        // Export the currently open presentation
        PowerPoint.Application ppApplication = null;
        ppApplication = new PowerPoint.Application();
        ppApplication.Activate();
        ppApplication.ActivePresentation.SaveAs(String.Format(exportPath, exportName), PowerPoint.PpSaveAsFileType.ppSaveAsWMV, Office.MsoTriState.msoTrue);

        checkfile(exportPath, exportName);

        MessageBox.Show("Finished");

    }

    protected void checkfile(string exportPath, string exportName)
    {
        FileInfo f = new FileInfo(String.Format(exportPath, exportName));
        while (IsFileLocked(f) == true) { System.Threading.Thread.Sleep(5000); }
        MessageBox.Show("Finished");
    }

    protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

}
}

根据我之前发布的一个线程,我还尝试了thread.Join(),看看是否可以在继续之前等待保存线程完成,但在保存文件时它根本没有暂停,因此我得到了相同的结果

如有任何帮助/建议,将不胜感激


谢谢

PowerPoint应用程序对象有一个ppMediaTaskStatus属性,该属性应返回您需要的信息。您可以使用PPT VBA IDE中的对象浏览器获取各种值。

PowerPoint应用程序对象具有一个ppMediaTaskStatus属性,该属性应返回此操作所需的信息。您可以使用PPT VBA IDE中的对象浏览器获取各种值。

由于checkfile函数本身没有太多内容,我猜问题出在IsFileLocked函数中(假设即使保存完成后它也会重复返回true)。您是否每次都会收到(并捕获)IOException?如果是,这是哪个异常?保存过程完成后,异常是否会更改?@Tim yes,IsFileLocked函数始终返回True。我可以看到文件系统上已经创建了一个文件,但它保持在0kb,而且永远不会变大。就像SaveAs被打断了一样。如果我把IsFileLocked拿出来,文件就创建得很完美了好吧,我明白你现在说的了。WMV文件的实际创建被检查中断-检查返回true的程度并不太高。。。这是因为文件没有真正被创建(然后被发布)?@蒂姆:是的,我想这就是发生的事情。。。因为当我把IsFileLocked拿出来的时候,它工作得非常好。如果我把它留在那里,文件开始创建(可以在我的磁盘上看到一个okb文件),但我从来没有完成保存。。。所以我猜它是
stream=file.Open(FileMode.Open,FileAccess.ReadWrite,FileShare.None)正在中断文件写入。快速看一眼就知道没有检查文件是否被锁定的好方法。也许你可以做一些事情,比如检查文件上的上次修改时间,如果它比某个预设值离现在更远,你就假设它已经完成了编写?因为checkfile函数本身没有太多内容,我猜问题出在IsFileLocked函数中(假设它在保存完成后重复返回true)。您是否每次都会收到(并捕获)IOException?如果是,这是哪个异常?保存过程完成后,异常是否会更改?@Tim yes,IsFileLocked函数始终返回True。我可以看到文件系统上已经创建了一个文件,但它保持在0kb,而且永远不会变大。就像SaveAs被打断了一样。如果我把IsFileLocked拿出来,文件就创建得很完美了好吧,我明白你现在说的了。WMV文件的实际创建被检查中断-检查返回true的程度并不太高。。。这是因为文件没有真正被创建(然后被发布)?@蒂姆:是的,我想这就是发生的事情。。。因为当我把IsFileLocked拿出来的时候,它工作得非常好。如果我把它留在那里,文件开始创建(可以在我的磁盘上看到一个okb文件),但我从来没有完成保存。。。所以我猜它是
stream=file.Open(FileMode.Open,FileAccess.ReadWrite,FileShare.None)正在中断文件写入。快速看一眼就知道没有检查文件是否被锁定的好方法。也许你可以做一些事情,比如检查文件上最后一次修改的时间,如果它距离现在比某个预设值更远,你就认为它已经写完了?太棒了我启动了一个后台线程,等待ppApplication.ActivePresentation.CreateVideoStatus==PowerPoint.ppmediastaskstatus.ppmediastaskstatus完成,它工作得非常好-非常感谢!感谢您确认它按预期工作。我真的不确定它会不会。太棒了我启动了一个后台线程,等待ppApplication.ActivePresentation.CreateVideoStatus==PowerPoint.ppmediastaskstatus.ppmediastaskstatus完成,它工作得非常好-非常感谢!感谢您确认它按预期工作。老实说,我不确定这是否会发生。