该进程无法访问其他进程使用的文件

时间:2015-04-07 18:02:53

标签: c# bytearray thread-sleep word-automation

我有一个Windows应用程序(在C#中),它将DOC文件发送到pdf打印机,创建pdf并读取字节。该应用程序使用word automation来使用以下代码打印pdf

object Background = false; //to make sure the pdf file is created before continuing
wordApp.Visible = true;
wordApp.ActivePrinter = printerName;/*pdf printer*/
wordDoc = wordApp.Documents.Open(ref objFileName,
 ref missing, ref objFalse, ref missing, ref missing, ref missing,
 ref missing, ref missing, ref missing, ref missing, ref missing,
 ref missing, ref missing, ref missing, ref missing, ref missing);
wordDoc.Activate();

wordDoc.PrintOut( Background, ref missing, ref Range, ref missing,
    ref missing, ref missing, ref missing, ref Copies,
    ref missing, ref PageType, ref PrintToFile, ref Collate,
    ref missing, ref ManualDuplexPrint, ref PrintZoomColumn,
    ref PrintZoomRow, ref missing, ref missing);

do
{System.Threading.Thread.Sleep(10);
} while (wordApp.BackgroundPrintingStatus > 0);
wordDoc.Close(ref objFalse, ref missing, ref missing);

创建pdf后,我使用

读取字节
bytes = System.IO.File.ReadAllBytes(Path.ChangeExtension(fileName, "pdf"));

即使我将背景设置为false,在目录中创建文件也需要一秒左右,因此readallbytes失败,因为找不到文件。我添加了以下代码以等待一段时间,以便显示pdf文件

while (!File.Exists(Path.ChangeExtension(fileName, "pdf")))
{
 System.Threading.Thread.Sleep(1000);
}
bytes = System.IO.File.ReadAllBytes(Path.ChangeExtension(fileName, "pdf"));

但有时我得到一个例外,即filename.pdf不存在或者我得到进程无法访问该文件,因为它被另一个进程使用。我不明白为什么文件不可访问,因为我没有做任何会锁定文件的事情和另一件事我不明白我有时可以读取字节,但这并不总是发生。我没有找到错误,这是否意味着文件不是在睡眠时间框架中创建的?

1 个答案:

答案 0 :(得分:2)

我建议您使用FileSystemWatcher对象监视新创建或新重命名文件的文件夹,而不是尝试使用Thread.Sleep执行此操作。这将允许您设置事件以在文件准备好时触发代码以进行后续处理。