2013-10-08 5 views
0

Я пытаюсь найти способ закрыть процесс, в котором хранится файл pdf, который я создаю. Я попытался уничтожить и закрыть поток после его создания, но я получаю сообщение, что процесс не может получить доступ к файлу '\ server \ PDFs \ test.pdf', потому что он используется другим процессом. В принципе, как только test.pdf создается первоначально, у меня есть страница, где они могут редактировать данные, и она воссоздает пересмотренный test.pdf. Любая идея, как я могу закрыть процесс? Я пытался сделать цикл while, чтобы продолжать попытки, но не повезло?Невозможно закрыть файл, используемый другим процессом

'Create the original pdf 
Dim pdfWrite As PdfWriter = PdfWriter.GetInstance(Doc1, New FileStream(path & myUniqueFileName, FileMode.Create)) 

    Doc1.Open() 
    Dim test As String 
    test = Session("PDF") 
    Dim PDFHeader As String 
    PDFHeader = Session("Header") 
    Dim imagepath As String = Server.MapPath(".") & "/images/Header.png" 
    Dim image As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imagepath) 
    image.ScalePercent(70.0F) 
    Dim line1 As New iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1) 

    Doc1.Add(image) 
    Doc1.Add(New Paragraph(PDFHeader)) 
    Doc1.Add(New Chunk(line1)) 
    Doc1.Add(New Paragraph(test)) 
    pdfWrite.Flush() 
    Doc1.Close() 
    Doc1.Dispose() 
    pdfWrite.Dispose() 
    pdfWrite.Close() 

Воссоздайте PDF после редактирования данных:

Dim _fileInUse As Boolean = True 
    Do While _fileInUse 
     _fileInUse = FileInUse(myUniqueFileName) 
     If Not _fileInUse Then 
      Dim pdfWrite As PdfWriter = PdfWriter.GetInstance(Doc1, New FileStream(path & myUniqueFileName, FileMode.Create)) 


      Doc1.Open() 
      Dim test As String 
      test = Session("PDF") 
      Dim PDFHeader As String 
      PDFHeader = Session("Header") 
      Dim imagepath As String = Server.MapPath(".") & "/images/Header.png" 
      Dim image As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imagepath) 
      image.ScalePercent(70.0F) 
      Dim line1 As New iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1) 

      Doc1.Add(image) 
      Doc1.Add(New Paragraph(PDFHeader)) 
      Doc1.Add(New Chunk(line1)) 
      Doc1.Add(New Paragraph(test)) 
     End If 
    Loop 



    Doc1.Close() 
    Doc1.Dispose() 

Public Function FileInUse(ByVal sFile As String) As Boolean 

    Dim thisFileInUse As Boolean = False 
    Dim fs As FileStream 

    If File.Exists(sFile) Then 
     Try 
      fs = File.Open(sFile, FileMode.Open, FileAccess.Write, FileShare.ReadWrite) 

      fs.Close() 
      fs.Dispose() 
     Catch 
      Try 
       fs.Close() 
       fs.Dispose() 
      Catch 

      End Try 

      thisFileInUse = True 
     End Try 
    End If 
    Return thisFileInUse 
End Function 
+0

Вы не можете перезаписать файл, но у вас есть возможность переименовать старый файл, а затем написать новый. –

+0

Как мне переименовать старый файл? – user1342164

ответ

2

У вас есть New FileStream в Dim pdfWrite As PdfWriter =... без возможности закрыть его.

Я предлагаю вам использовать Использование построить, чтобы заботиться о утилизации вещей для вас, а также воспользоваться пунктом Наконец в try..catch, как это:

Sub X() 
    'Create the original pdf 
    Using doc1 As New Document 
     Dim myFile As String = Path.Combine(myPath, myUniqueFileName) 
     Using fs As New FileStream(myFile, FileMode.Create) 
      Using pdfWrite As PdfWriter = PdfWriter.GetInstance(doc1, fs) 

       doc1.Open() 
       Dim test As String 
       test = Session("PDF") 
       Dim PDFHeader As String 
       PDFHeader = Session("Header") 
       Dim imagepath As String = Server.MapPath("./images/Header.png") 
       Dim image As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imagepath) 
       image.ScalePercent(70.0F) 
       Dim line1 As New iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1) 

       doc1.Add(image) 
       doc1.Add(New Paragraph(PDFHeader)) 
       doc1.Add(New Chunk(line1)) 
       doc1.Add(New Paragraph(test)) 
       pdfWrite.Flush() 

      End Using 
     End Using 
    End Using 

End Sub 

Public Function FileInUse(ByVal sFile As String) As Boolean 

    Dim thisFileInUse As Boolean = False 

    If File.Exists(sFile) Then 
     Dim fs As FileStream = Nothing 
     Try 
      fs = File.Open(sFile, FileMode.Open, FileAccess.Write, FileShare.None) 
     Catch 
      thisFileInUse = True 
     Finally 
      If fs IsNot Nothing Then 
       fs.Dispose() 
      End If 
     End Try 
    End If 

    Return thisFileInUse 

End Function 

Окончательно часть из Try..Catch всегда работает.

Edit: Вы, конечно, проверили, что метод .Dispose() на экземпляре класса будет заботиться о любом домашнем хозяйстве, которое должно быть сделано, например, я проверил Stream.Dispose Method до этого не делать явным. Закрыть(). У меня нет документации для использования методов ITextSharp, поэтому вам придется проверить это самостоятельно.

+0

+1 за хороший совет по поводу использования предложений. – geedubb

+0

Спасибо. Я попробую это и пометю как ответ после того, как я закончу – user1342164

+0

Я попробовал «ИСПОЛЬЗОВАТЬ», как в вашем примере и по-прежнему та же ошибка. Я не уверен, как я должен использовать метод dispose(). Я делаю pdfwrite.dispose – user1342164

0

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

Что-то вроде этого ?:

'Create the original pdf 
Dim pdfWrite As PdfWriter = PdfWriter.GetInstance(Doc1, New FileStream(path &   myUniqueFileName, FileMode.Create)) 
Dim rdm As New Random() 
Dim newName As String 
newName = myUniqueFileName + rdm.Next(0, 100000).ToString("00000") 

Dim pdfWrite As PdfWriter = PdfWriter.GetInstance(Doc1, New FileStream(path & newName , FileMode.Create)) 
Doc1.Open() 
Dim test As String 
test = Session("PDF") 
Dim PDFHeader As String 
PDFHeader = Session("Header") 
Dim imagepath As String = Server.MapPath(".") & "/images/Header.png" 
Dim image As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imagepath) 
     image.ScalePercent(70.0F) 
Dim line1 As New iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1) 

Doc1.Add(image) 
Doc1.Add(New Paragraph(PDFHeader)) 
Doc1.Add(New Chunk(line1)) 
Doc1.Add(New Paragraph(test)) 

Doc1.Close() 
Doc1.Dispose() 
+0

Спасибо. Я попробую это и отметю как ответ после того, как я закончу – user1342164

Смежные вопросы