C #, как проверить, открыт ли файл PDF (также с использованием itextsharp) - PullRequest
0 голосов
/ 09 ноября 2018

У меня были проблемы с выяснением того, как проверить в моей программе, открыт ли документ PDF или нет. Это серьезная проблема, потому что моя программа создает документы pdf для моего клиента, но мой клиент просматривает свой документ, открывая его, и пытается исправить любые орфографические ошибки, пока документ pdf открыт, что приводит к сбою программы и значительному снижению производительности. , Я попробовал несколько методов, чтобы попытаться определить, открыта ли программа или нет, но безрезультатно.

Эта программа является настольным приложением C #, которое используется для создания PDF-документов с использованием itextsharp.

Может кто-нибудь дать мне заявление, которое я могу использовать, чтобы проверить, открыт ли pdf или нет или используется другим процессом? Моя клиентка не может продолжать свою работу, пока это не будет исправлено.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Это метод, который я использовал в своих проектах прежде, чтобы убедиться, что файл используется:

 bool IsAvailable(string path)
 {
      try
      {
           if (File.Exists(path))
              using (File.OpenRead(path))
              {
                  return true;
              }
           else
              return false;
       }
       catch (Exception)
       {
           Thread.Sleep(100);
           return InUse(path);
       }
 }

Ожидает, пока файл станет доступным (не используется). если в catch вы вернете false вместо рекурсивного вызова метода снова, он просто проверит его один раз.

Также приведенный выше код вернет false, если файл не существует. Так что если вам это не нужно, можете удалить и эту часть:

 bool IsAvailable(string path)
 {
      try
      {
          using (File.OpenRead(path))return true;
      }
      catch {}
      return false;
 }
0 голосов
/ 09 ноября 2018

Вы должны сделать это так же, как и для любого типа файла.

protected virtual bool IsFileInUse(FileInfo file)
{
    try
    {
          FileStream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
          stream.Dispose();
    }
    catch (IOException)
    {
       //Could not access because file is in use.
        return true;
    }


//file is not in use
return false;
}

FileShare.None гарантирует, что пока у вас есть доступ, никто не сможет открыть файл для изменения.

Примечание. Это может не работать, если читатель загрузил поток файлов и затем закрыл файл. Но тогда, я думаю, это не проблема для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...