使用Interop.Word C#将doc转换为pdf

时间:2016-02-04 15:37:45

标签: c# .net ms-word office-interop filesystemwatcher

我使用C#将.doc转换为.pdf。 .doc位于供应商的网站上。要获取.doc,我们必须单击一个按钮,向我们提供Open, Save, or Cancel的选项。当用户点击Save按钮时,会提示输入该位置。用户选择映射驱动器中的位置,例如S:\Some Folder\abc.doc,实际文件夹位置为\\server\\folder\Some Folder。这是我的程序进入的地方。我在c#中使用FileSystemWatcher类,并为.doc文件设置了过滤器。我可以在调试中看到找到该文件。文件夹位置是硬编码的,并保存为上面提到的实际文件夹位置。用户和应用程序具有该文件夹的完全权限。但是,当我运行程序时,我得到FileNotFoundException

这就是我所拥有的

        WriteToFile("Starting Word application");
        Application word = new Application();

        object missing = Type.Missing;

        var sourcefile = new FileInfo(path);

        // check if the created file ends with .doc. 
        System.Diagnostics.Debug.WriteLine(path);
        if (!path.ToLower().EndsWith(".doc"))
        {
            return "";
        }

        word.Visible = false;

        WriteToFile("Opening doc as read only");
        // open readonly            
        System.Diagnostics.Debug.WriteLine(sourcefile.FullName);
        var doc = word.Documents.Open(FileName: sourcefile.FullName, ReadOnly: true);

奇怪的是sourcefile.FullName没有显示path设置的硬编码服务器地址。它将文件路径显示为S:\Some Folder\abc.doc,这对我来说毫无意义。这里发生了什么,以及为什么找不到该文件?

2 个答案:

答案 0 :(得分:1)

当基础文件仍在使用/被写入时,OnCreate事件可能会触发,如果您立即尝试访问它,可能会导致问题。

简单的解决方案是引入任意延迟以允许文件被创建它的进程关闭,或者更好的是具有尝试访问文件的短延迟的循环,捕获相关的异常,如果它发生并且重试。

答案 1 :(得分:0)

我的猜测是你使用了错误的FileInfo对象。尝试生成一个新的或使用

System.IO.Path.Combine(@"\\server\folder\Some Folder", "sourcefile.Name") 

您还可以使用它来生成新的FileInfo对象。您正在使用的对象可能是使用映射驱动器的用户对话框之一。您的位置也有拼写错误。 \\SERVERNAME\\不是UNC路径。字符串的开头应该只有两个反斜杠。它应该是

@"\\server\folder\Some Folder"

WriteToFile("Starting Word application");
Application word = new Word.Application();

object missing = Type.Missing;

var sourcefile = new System.IO.FileInfo(path);
string SomeShare = @"\\SomeServer\Someshare\Somepath";
System.IO.FileInfo WorkFile = new System.IO.FileInfo(System.IO.Path.Combine(SomeShare, sourcefile.Name));

// check if the created file ends with .doc. 
System.Diagnostics.Debug.WriteLine(path);
if (!path.ToLower().EndsWith(".doc"))
{
     return "";
}

word.Visible = false;

WriteToFile("Opening doc as read only");
// open readonly            
System.Diagnostics.Debug.WriteLine(sourcefile.FullName);
var doc = word.Documents.Open(FileName: WorkFile.FullName, ReadOnly: true);
}  

这对我来说很好,它更新了正确的UNC模式的路径。如果文件仍然无法访问,您应该检查是否可以使用生成的UNC路径在工作站上打开它。