У меня есть приложение Windows (в C#), которое отправляет файл DOC на принтер PDF, создает PDF и считывает байты. Приложение использует автоматику слова для печати 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"));
Даже если я установить фон к ложному, это занять второе или поэтому для файла, который будет создан в каталоге, так что 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 не существует, или я получаю процесс не может получить доступ к файлу, как он используется другим обработать. Я не понимаю, почему файл недоступен, так как я не делаю ничего, что бы заблокировать файл, а другая вещь, которую я не получаю, я иногда читаю байты, но это происходит не всегда. Я не нашел ошибку, означает ли это, что файл не создан во временном тайме сна?
Если вы используете 'Microsoft.Interop', я бы предложил вам изучить, как использовать' System.Runtime.InteropServices.Marshal.ReleaseComObject ('метод вы можете попробовать: GC.Collect(); GC.WaitForPendingFinalizers () ' – MethodMan
Я делаю это в блоке finally, который выглядит как' Marshal.ReleaseComObject (wordapp) ' –
, который хорошо знать, так как вы на самом деле не показываете это. Не большое дело, я бы предложил использовать FileSystemWatcher .. и там это несколько вещей, которые вам нужно будет установить при использовании одного .one, в частности, это отключить событие listner и вернуть его обратно .. с той же проблемой 3 недели назад, и я сделал простое изменение, чтобы отключить событие, которое прослушивает Я был полностью закончен с файлом, а затем снова включил его. – MethodMan