Tôi đang làm việc với thư viện thao tác JPEG/EXIF của bên thứ 3 (Mediautil) đang khiến tôi bị nhức đầu. Tôi muốn thay đổi dữ liệu EXIF của một hình ảnh. Để thực hiện việc này, tôi cần phải viết phiên bản cập nhật vào một tệp tạm thời, xóa tệp gốc và sau đó đổi tên tệp tạm thời thành tên gốc.Cách chẩn đoán File.delete() trả về false/tìm các luồng không được xác định?
Vấn đề của tôi là cuộc gọi File.delete()
không thành công và trả về false
, có lẽ vì thư viện vẫn mở theo cách nào đó - nhưng tôi đã làm mọi thứ tôi có thể tìm thấy trong API để đóng tất cả các luồng. Thậm chí tệ hơn: vấn đề dường như phụ thuộc vào thời gian, và các bài kiểm tra Đơn vị xảy ra đôi khi thất bại và đôi khi không - nhưng mã là không phải là đa luồng.
Thật kỳ lạ, có một cuộc gọi thư viện loại bỏ sự cố - nhưng nó cũng xóa hình thu nhỏ EXIF mà tôi thực sự không muốn. Và nhìn vào mã, tôi hoàn toàn không thể nhìn thấy nơi nó đóng cửa bất kỳ dòng mà nếu không có thể ở lại mở.
Bất kỳ ý tưởng nào về cách tấn công vấn đề này?
Edit: Đây là trên Windows XP, Java 6. Và một điều: Tôi đã phát hiện ra rằng nếu tôi gọi System.gc()
trước khi gọi File.delete()
, nó hoạt động - có lẽ vì điều đó gây nên một số finalizer. Vì vậy, nó chắc chắn có vẻ là một luồng không rõ ràng.
Bạn có một trình antivirus chạy trên máy tính này? Đôi khi AV có thể tạm thời mở tệp sau khi bạn đã viết nó, dẫn đến hành vi rời rạc mà bạn đề cập đến đôi khi bạn "không may mắn" tại thời điểm bạn cố xóa. –
Trên nền tảng nào? –
@Neil ý tưởng hay, nhưng tắt AV không tạo ra sự khác biệt. –