2013-03-25 37 views
6

Phương pháp web của tôi tạo tệp pdf trong thư mục% temp% của tôi và hoạt động. Sau đó tôi muốn thêm một số trường tùy chỉnh (meta) vào tệp đó bằng cách sử dụng mã bên dưới.Không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác

Lớp PdfStamper tạo IOException, cho dù tôi sử dụng phương thức .Close() hoặc khối using của nó chỉ kết thúc. Quá trình đó vẫn còn giữ trên để xử lý tập tin là máy chủ web webdev chính nó (tôi đang gỡ lỗi trong VS2010 SP1).

private string AddCustomMetaData(string guid, int companyID, string filePath) 
{ 
    try 
    { 
     PdfReader reader = new PdfReader(filePath); 

     using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) 
     { 
      PdfStamper st = new PdfStamper(reader, fs); 
      Dictionary<string, string> info = reader.Info; 
      info.Add("Guid", guid); 
      info.Add("CompanyID", companyID.ToString()); 

      st.MoreInfo = info; 
      st.Close(); 
     } 

     reader.Close(); 

     return guid; 
    } 
    catch (Exception e) 
    { 
     return e.Message; 
    } 
} 

Không có vấn đề gì tôi cố gắng, nó giữ ném ngoại lệ tại st.Close();, để được chính xác hơn:

Quá trình không thể truy cập các tập tin 'C: \ Users [username tôi] \ AppData \ Local \ Temp \ 53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf ' vì nó đang được sử dụng bởi một tiến trình khác.

Hoặc tôi đang xem điều gì đó hiển nhiên hoặc có vấn đề với lớp học PdfStamper Tôi chưa biết. Các phiên bản của itextsharp được sử dụng là 5.3.3.0 và 5.4.0.0, vấn đề là như nhau.

Mọi thông tin chi tiết sẽ được đánh giá cao.

EDIT: Tôi hiện đang "mã hóa xung quanh" vấn đề, nhưng tôi chưa tìm thấy giải pháp nào.

+1

bạn có chắc chắn rằng tệp không được sử dụng trước khi trình đọc pdf mở nó không? (như bạn đang làm gì với tệp này trước đó) – Sayse

+0

tốt hơn, hãy thử chuyển đổi thứ tự mở tệp của bạn ('filestream' trước 'trình đọc pdf') – Sayse

Trả lời

15

Bạn đang gặp sự cố là bạn đang ghi vào một tệp trong khi bạn cũng đang đọc từ tệp đó. Không giống như một số loại tệp (JPG, PNG, v.v.) mà "tải" tất cả dữ liệu vào bộ nhớ, iTextSharp đọc dữ liệu dưới dạng luồng. Bạn cần phải sử dụng hai tệp và hoán đổi chúng ở cuối hoặc bạn có thể buộc iTextSharp tải "" tệp đầu tiên bằng cách liên kết PdfReader của bạn với một mảng byte của tệp.

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath)); 
+1

Tôi đã tìm kiếm giải pháp này trong nhiều giờ. Hoạt động hoàn hảo! – Baxter

0

Cố gắng .Dispose() đọc PDF của bạn (hoặc bất cứ điều gì bạn sử dụng để tạo ra nó) khi bạn lưu các tập tin cho lần đầu tiên

+0

Đó là ngoài tầm với của tôi. Dịch vụ web gọi một dll ActiveX chấp nhận đường dẫn tệp. Các op viết đầu tiên là ngoài tầm kiểm soát của tôi. –

1

tôi đề nghị bạn sử dụng FileShare enumerator khi bạn mở tập tin, vì vậy hãy thử để mở một tập tin với None sharing

File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None); 
+0

Đã cố gắng, vấn đề vẫn tồn tại. –

+0

ok nhưng đó là lạ –

0

Hãy thử giải pháp này nếu bạn nghĩ khả thi của nó cho bạn - khi WebMethod tạo tập tin trong thư mục Temp, bạn cần phải sao chép các tập tin và dán nó vào vị trí khác hoặc cùng một vị trí với nhau tên và chuyển đường dẫn tệp mới được sao chép sang trình đọc PDF của bạn.

+0

Có, nhưng điều đó không giải thích lý do là gì của vấn đề này –

Các vấn đề liên quan