错误:由于另一个进程正在使用该文件,因此无法访问该文件。

3

我正在尝试将Word转换为PDF文件,但出现了错误:“由于另一个进程正在使用该文件,因此无法访问该文件。”

    public Microsoft.Office.Interop.Word.Document wordDocuments { get; set; }

    Microsoft.Office.Interop.Word.Application apword = new Microsoft.Office.Interop.Word.Application();
    try
    {
        if (uploadFInput.HasFile)
        {
            targetPathip = Server.MapPath(Path.GetFileName(uploadFInput.PostedFile.FileName));

            if (File.Exists(targetPathip))
            {
                File.Delete(targetPathip);
            }

            string Extentsion_path = Path.GetExtension(targetPathip);
            string Filename_path = Path.GetFileName(targetPathip);
            if (Extentsion_path == ".doc" || Extentsion_path == ".docx")
            {
                uploadFInput.SaveAs(targetPathip);
                LblFleip.Text = targetPathip;

                //wordDocuments = apword.Documents.Open(Filename_path);
                wordDocuments = apword.Documents.Open(Filename_path);
                // wordDocuments = apword.Documents.Open(targetPathip);

                wordDocuments.ExportAsFixedFormat(Filename_path, WdExportFormat.wdExportFormatPDF);
                apword.Documents.Close(Filename_path);
            }
            string filename = Path.GetFileName(targetPathip);
            uploadFInput.SaveAs(targetPathip);
            LblFleip.Text = targetPathip;
        }
    }
    catch (Exception ex)
    {
        apword = null;
        return;
    }

在我进行转换时,我的代码中是否有任何漏洞?有人可以告诉我如何将 Word 转换为 PDF 吗?


1
@ user2246674 相同的代码在 Windows 窗体中已经运行成功了.... - pdp
1
当您运行此代码时,实际的 Word 文档并没有在您的桌面上打开,是吗? - Ben Narube
1
你确定它崩溃的确切代码行是那一行吗?你有进行步进调试吗?(你应该在apwords声明周围加上using块) - Sayse
File.Delete(targetPathip); 这一行出现了问题。如果文件已经存在,则应该删除。但是在这个位置我遇到了一个错误:“由于另一个进程正在使用该文件,因此无法访问该文件”。 - pdp
如果文件存在,则打开它。这段代码适用于PDF文件作为输入的情况。但是对于Word文件,我遇到了错误。 - pdp
显示剩余2条评论
5个回答

2
你需要做的是确定正在占用文件的进程。要找出这一点,您需要从SysInternals(现在是Microsoft的一部分)下载Process Explorer。
这将允许您搜索所有进程,以查找哪些进程具有对您的文件的打开句柄。
当然,文件冲突可能与较不明显的文件(如配置或锁定文件)有关。在这种情况下,Process Monitor(也来自SysInternals)应该可以让您看到失败的原因。
这两个工具都非常出色,一旦您使用它们,它们将成为您的武器库的一部分。

0

如果您第一次运行代码,可能会没问题。但很明显文件没有被正确释放。标准的.NET GC不能正确处理Interop对象。所以,有几个提示:
1)不要使用Interop.Word.DocumentInterop.Word.Application创建公共属性。在您的方法中使用它们并尽快处理。
2)关闭Application的第二个原因是RPC服务器具有超时时间。如果您保持Application打开一段时间,它将自动从RPC服务器断开连接,您将无法使用它。

考虑到这一点,您必须在finally语句中调用apword.Quit();,而不是在catch中,并且仅使用apword = null是不够的。
如果应用程序因错误而关闭-请务必杀死Word进程。
离开方法之前别忘了调用wordDocuments.Close(ref SaveChanges)


-1
变量包含带扩展名的文件名,因此您正在尝试保存已打开的文档。请添加一个扩展名:
 wordDocuments.ExportAsFixedFormat(Filename_path + ".pdf",
     WdExportFormat.wdExportFormatPDF);

我猜测这行代码 File.Delete(targetPathip); 不是问题所在,可能是在第二次运行时,因为应用程序仍然持有第一次运行中打开的文件(请参见任务管理器)。


如果这是第二次运行,我曾经想过这个问题,如果是这种情况,正确处理apword即可解决。 - Sayse

-1

曾经遇到过类似的问题,尝试在打开文件之前先关闭它(听起来很愚蠢,但对我有效...)。

apword.Documents.Close(Filename_path);
wordDocuments = apword.Documents.Open(Filename_path);

异常:@3wic 该方法或属性不可用,因为没有活动文档窗口。 - pdp

-2

你只需要添加

using System.Threading;

在 cs 页面的顶部.. 并添加

Thread.SpinWait(6000);

在显示错误的文本顶部。

尝试这个,如果需要帮助告诉我。


2
我建议不要这样做... 看起来只会拖延问题。 - Sayse
1
@mitesh 这只会简单地延迟它。如果 PDF 或 Word 文件非常大,这将会很困难。 - pdp
1
我同意 @sayse 的观点,这会延迟。 - pdp
我已经尝试过并且对我有效。但是我必须使其能够复制我的图像,然后在之后将其删除。 - Mitesh Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接