代码之家  ›  专栏  ›  技术社区  ›  user1828605

使用Interop将文档转换为pdf。单词C#

  •  0
  • user1828605  · 技术社区  · 9 年前

    我使用C#将.doc转换为.pdf。.doc位于供应商的网站上。要获取.doc,我们必须单击一个按钮,该按钮为我们提供选项 Open, Save, or Cancel 。当用户单击 Save 按钮,它会提示输入位置。用户选择映射驱动器中的位置, S:\Some Folder\abc.doc ,实际文件夹位置为 \\server\\folder\Some Folder 。这就是我的程序要玩的地方。我正在使用 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: \某些文件夹\abc.doc ,这对我来说毫无意义。这里发生了什么,为什么找不到文件?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Alex K.    9 年前

    这个 OnCreate 当底层文件仍在使用/正在写入时,事件可能会触发,如果您立即尝试访问该文件,可能会导致问题。

    简单的解决方案是引入任意延迟以允许创建文件的进程关闭该文件,或者引入一个具有短延迟的循环,尝试访问该文件,在发生异常时捕获相关异常并重试。

        2
  •  0
  •   Kerwi    9 年前

    我猜您使用了错误的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路径在工作站上打开该文件。