2013-08-06 12 views
7

Tôi đang cố gắng quản lý tệp trong ứng dụng web của mình. Đôi khi, tôi phải tạo một tập tin trong một thư mục (với File.Copy):Tệp đang được sử dụng bởi một quy trình khác sau khi tệp File.Copy

File.Copy(@oldPath, @newPath); 

Và một vài giây sau tập tin đó có thể bị xóa:

if (File.Exists(@newPath)) { 
    File.Delete(@newPath);    
} 

Tuy nhiên, tôi không biết tại sao tập tin mới vẫn bị chặn bởi quá trình máy chủ (IIS, w3wp.exe) sau File.Copy. Sau khi File.Delete tôi nhận được ngoại lệ:

"Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác."

Theo Api, File.Copy không chặn tệp, phải không?

Tôi đã cố gắng giải phóng tài nguyên nhưng chưa hoạt động. Làm cách nào tôi có thể giải quyết vấn đề này?

CẬP NHẬT: Thật vậy, việc sử dụng Process Explorer tệp bị chặn bởi quá trình IIS. Tôi đã cố gắng triển khai mã sao chép để giải phóng tài nguyên theo cách thủ công nhưng vấn đề vẫn tiếp diễn:

public void copy(String oldPath, String newPath) 
    { 
    FileStream input = null; 
    FileStream output = null; 
    try 
    { 
     input = new FileStream(oldPath, FileMode.Open); 
     output = new FileStream(newPath, FileMode.Create, FileAccess.ReadWrite); 

     byte[] buffer = new byte[32768]; 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
     output.Write(buffer, 0, read); 
     } 
    } 
    catch (Exception e) 
    { 
    } 
    finally 
    { 
     input.Close(); 
     input.Dispose(); 
     output.Close(); 
     output.Dispose(); 
    } 
    } 
+1

Vậy điều gì đang sử dụng tệp? Rõ ràng bạn sẽ không chỉ tạo ra một tập tin vô nghĩa mà không có gì khác chỉ sử dụng để xóa nó một vài giây sau đó, vì vậy một cái gì đó phải được sử dụng nó. Cái gì đó? –

+0

Tệp đến từ một hệ thống khác, vì vậy, nó được thay đổi trong đó, tôi phải thay thế tệp cũ. Tôi đang phát triển một hệ thống "gương". – jbernal

+0

Có lẽ câu hỏi tương tự này có thể giúp bạn: http://stackoverflow.com/questions/7937966/ – Bridge

Trả lời

0

Tệp đang bị chặn bởi một quy trình khác mà tôi không biết. Process Explorer thực sự hữu ích.

Vấn đề dễ gặp khó khăn.

2

Điều này có thể do trình chỉ mục tệp hoặc phần mềm diệt vi-rút quét thường tất cả các tệp mới.

+1

Tất nhiên, đó là một lựa chọn nhưng phải mất bao nhiêu thời gian? Tôi đã đợi vài phút nhưng tệp vẫn tiếp tục bị chặn. – jbernal

+1

Bạn có thể thử [Process Explorer] (http://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx) từ sysinternals. Sử dụng tính năng "Tìm xử lý hoặc DLL" sẽ cho bạn thấy các quy trình nào có xử lý mở trên tệp của bạn. – x5657

+1

Chương trình rất hữu ích. Tôi đã sử dụng nó và thực sự là quá trình duy nhất sử dụng tập tin là w3wp.exe (IIS). Tôi sẽ thực hiện chức năng sao chép với các dòng để viết một cách rõ ràng câu lệnh close() hoặc dispose(). – jbernal

3

Bạn có thể thử Process Explorer để tìm ứng dụng nào đã mở xử lý tệp. Nếu Process Explorer không thể tìm thấy, hãy sử dụng Process Monitor để theo dõi quá trình nào đang cố truy cập tệp.