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();
}
}
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ì đó? –
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
Có lẽ câu hỏi tương tự này có thể giúp bạn: http://stackoverflow.com/questions/7937966/ – Bridge