2011-11-07 9 views
1

私は、PDFファイルを生成するvb.net MVC3 Razorアプリを持っています。問題は2人の別々のユーザーが同時に印刷ボタンをクリックした場合、それは次の例外をスローすることです..:ファイルの読み込み/書き込みが終了するまでファイルの読み込みを遅らせますか?

The process cannot access the file 'E:\web\xxxxxxxxxxsonl\PDF_Files\MailingLables.pdf' because it is being used by another process. 

    All of the controller actions to do with printing are basically like below: 

Function Ind_Cert(ByVal firstName As String, ByVal lastname As String, ByVal classRef As String) 
     Dim _Attendance As attendance = db.attendances.Where(Function(f) f.Completed_Class = "Completed" And f.firstName = firstName And f.lastName = lastname).FirstOrDefault 
     If Not IsNothing(_Attendance) Then 
      Dim _reg_classes As List(Of reg_classes) = db.reg_classes.ToList 
      Dim _registrants As List(Of reg_info) = db.reg_info.ToList 
      Dim _courses As List(Of cours) = db.courses.ToList 
      Dim _Board As List(Of board_members) = db.board_members.ToList 
      Dim Board_Member As board_members = _Board.Where(Function(f) f.Official_Cap = "xxxxxx President").FirstOrDefault 
      Dim RecordId As Integer = 0 
      Dim conf_info As conf_info = db.conf_info.Single(Function(r) r.id = 0) 
      Dim conf_num As Integer = conf_info.conf_number 
      Dim _conf_num As String = conf_num.ToString 
      Dim Length As Integer 
      Dim _prefix As String = String.Empty 

      If Str(conf_num) <> "" Then 
       Length = Str(conf_num).Length 
      End If 


      Dim Divisor As Integer = 10^(Length - 1) 
      Dim conf_num_start As Integer = 0 
      Dim Digits(Length - 1) As Integer 

      While (conf_num > 10) 

       'Extract the first digit 
       Digits(conf_num_start) = Int(conf_num/Divisor) 

       'Extract remainder number - and store it back in Num 
       conf_num = conf_num Mod Divisor 

       'Decrease Divisor's value by 1/10th units 
       Divisor /= 10 

       'Increment Index 
       conf_num_start += 1 

      End While 


      If conf_num = 0 Or 4 Or 5 Or 6 Or 7 Or 8 Or 9 Then _prefix = "th" 
      If conf_num = 1 Then _prefix = "st" 
      If conf_num = 2 Then _prefix = "nd" 
      If conf_num = 3 Then _prefix = "rd" 




      Dim pdfpath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "\PDF_Files\" 
      Dim imagepath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "\PDF_Files\" 
      Dim _PdfName As String = "Cert_" + lastname + ".pdf" 
      Dim doc As New Document 
      doc.SetPageSize(iTextSharp.text.PageSize.LETTER.Rotate()) 
      doc.SetMargins(1, 1, 1, 1) 
      Dim _pageCounter As Integer = 0 

      Dim Californian As BaseFont = BaseFont.CreateFont(Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "\Fonts\" + "CALIFB.TTF", BaseFont.CP1252, BaseFont.EMBEDDED) 
      Dim Copper As BaseFont = BaseFont.CreateFont(Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "\Fonts\" + "COPRGTB.TTF", BaseFont.CP1252, BaseFont.EMBEDDED) 
      Dim Bold_Times As BaseFont = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.CP1252, False) 
      Dim BF_Times As BaseFont = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, False) 
      Dim F_Name As New Font(BF_Times, 16, Font.BOLD, BaseColor.BLACK) 
      Dim _Parking_Name As New Font(BF_Times, 18, Font.NORMAL, BaseColor.BLACK) 
      Dim _Parking_Date As New Font(BF_Times, 24, Font.BOLD, BaseColor.BLACK) 

      '**********************************Y lines for trial*********************************** 
      Dim y_line1 As Integer = 670 
      Dim _Counter As Integer = 1 
      Dim _Page As String = 1 





      Dim _CertJpg As Image = Image.GetInstance(imagepath + "/cert.jpg") 
      Dim imageWidth As Decimal = _CertJpg.Width 
      Dim imageHeight As Decimal = _CertJpg.Height 
      Dim writer As PdfWriter = PdfWriter.GetInstance(doc, New FileStream(pdfpath + _PdfName, FileMode.Create)) 
      doc.Open() 
      Dim cb As PdfContentByte = writer.DirectContent 


      If _Attendance.Completed_Class = "Completed" Then 

       Dim _confInfo As conf_info = db.conf_info.Single(Function(a) a.id = 0) 
       Dim year As String = Right(_confInfo.conf_start_date, 4) 
       Dim _reg As reg_info = db.reg_info.Single(Function(b) b.id = _Attendance.reg_id) 
       Dim name As String = _reg.first_name + " " + _reg.last_name 
       Dim _dates As String = _confInfo.conf_start_date + " - " + _confInfo.conf_end_date 
       Dim _course As cours = db.courses.Single(Function(c) c.course_ref = _Attendance.course_ref) 
       Dim _className As String = _course.course_title.ToString 
       Dim _hours As String = _course.course_hours 
       Dim _certName As String = Board_Member.First_Name + " " + Board_Member.last_name 


       _CertJpg.Alignment = iTextSharp.text.Image.UNDERLYING 
       _CertJpg.ScaleToFit(792, 611) 
       doc.Add(_CertJpg) 

       cb.BeginText() 
       cb.SetFontAndSize(Californian, 36) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "CERTIFICATE OF COMPLETION", 396, 397.91, 0) 
       cb.SetFontAndSize(Bold_Times, 22) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, name, 396, 322.35, 0) 
       cb.SetFontAndSize(Bold_Times, 16) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _hours + " Hours", 297.05, 285.44, 0) 
       cb.SetFontAndSize(Bold_Times, 16) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _dates, 494.95, 285.44, 0) 
       cb.SetFontAndSize(Bold_Times, 16) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "Class Attended: " + " " + _Attendance.course_ref + " -- " + _className, 396, 230.34, 0) 
       cb.SetFontAndSize(Copper, 16) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _conf_num + _prefix + " Annual Conference " + _dates, 396, 193.89, 0) 
       cb.SetFontAndSize(Bold_Times, 13) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, _certName, 396, 175.69, 0) 
       cb.SetFontAndSize(Bold_Times, 10) 
       cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "xxxxxxx President", 396, 162.64, 0) 
       cb.EndText() 

      End If 

      doc.Close() 
      Return _PdfName 
     Else 
      Return "Fail" 
     End If 


    End Function 

このエラーは、私はすべての時間は2人のユーザーが同じでPDFファイルを生成しようと言ったように起こります時間。誰でもこの問題の修正を知っていますか? Googleは、そのファイルが使用されているため、誰かがWindows上のファイルを削除できないという無数のページを公開しています。しかし、それは多くの助けはありません..任意のアイデア???

答えて

2

あなたはかなり多くのことを行うことができます。

  1. ロックが

  2. がクリアされるまで、各インスタンスに一意のファイルを作成し、ファイルのロックを追加し、(など、第3および第4の)第二ブロック。

#2をお勧めします。同じファイル名をそのまま使用できます。ファイルを一意のディレクトリに置くだけです。通常、GUIDは私にとっては最も簡単です。

Dim pdfpath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "\PDF_Files\" 
pdfPath = Path.Combine(pdfPath, Guid.NewGuid.ToString()) 
Directory.CreateDirectory(pdfPath) 

次に、上記で作成したパスを含めるように戻ります。

+0

を参照してください。..機能は似ていますが、pdf名は実際には両方の機能で異なります.. – Skindeep2366

+0

私が必要としてくれたことは素晴らしいことでした。私はまた、医者に処分を加えました。多くの問題はなく、それらがダウンロードされた後、それだけのデータが含まれていることを確実にするたびに、現在で新鮮なものを生成するので、それはまた、それが簡単に不必要なPDFファイルをクリーンアップするために作られた...再び助けてくれてありがとうませ – Skindeep2366

2

ランダムなファイル名でPDFファイルを作成して、競合を避けることはできますか?

0

ロックでファイルアクセスコードを囲みます。

lock (this) 
    { 
    //Write file 
    } 

は私が同時に2人の異なるユーザーを使用していたに発生するエラーを強制し、2つの異なるPDF生成機能を選択したときに理由があること...それはファイル名であることを考えたことはありませんLock on MSDN

関連する問題