2012-01-10 26 views
8

Tôi đang gặp sự cố lặp lại trong ứng dụng theo dõi nội dung tệp trong thư mục, dựa trên API Java 7 WatchService. Khi hệ thống tệp cơ bản kích hoạt sự kiện sửa đổi trên một tệp, tôi muốn tính toán SHA-256 ngay lập tức. Tuy nhiên, thường xảy ra rằng một quá trình khác đã mở tệp (tức là Word), do đó giữ một khóa độc quyền và ngăn ứng dụng của tôi khỏi bất kỳ hoạt động đọc/ghi nào. Nếu bất kỳ Suối/Kênh được tạo ra chống lại các tập tin mở ra, một FileNotFoundException hay FileSystemException cho nio API được ném với một thông điệp như:Java I/O: Đảm bảo tệp không bị khóa bởi một quy trình khác trước khi bất kỳ hoạt động r/w nào

Quá trình này không thể truy cập các tập tin vì nó đang được sử dụng bởi quá trình khác

Tôi đã không thể đi kèm với một giải pháp có thể phát hiện các trường hợp như vậy mà không che giấu một "thực" FileNotFoundException khi tệp không thực sự tồn tại trên fs.

Tôi đã đưa ra ý tưởng để kiểm tra sự tồn tại thông qua File.exists và sau đó nếu một FileNotFoundException được ném khi tôi mở một luồng, tôi sẽ có thể suy ra rằng tệp bị khóa. Tôi mở cho bất kỳ đầu vào về điều này!

Cảm ơn!

+0

có bao giờ tìm được giải pháp cho điều này không? –

+0

Tôi đã kết thúc bằng cách sử dụng heuristic được đề cập, nếu File.exists trả về true trong khối catch FileNotFoundException tôi giải thích nó như là một tập tin bị khóa. – sylvain

Trả lời

1

Bạn đã tự mình cố gắng khóa tệp chưa? Tôi sẽ giả sử bạn chỉ có thể có được một khóa nếu nó không bị khóa và tồn tại.

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29

+0

Tôi không thể gọi tryLock() vì các ngoại lệ đã đề cập được ném khi tôi cố gắng lấy một FileChannel qua RandomAccessFile hoặc FileOutputStream. – sylvain

+0

Trong trường hợp đó, có vẻ như bạn phải kiểm tra Ngoại lệ được ném khi bạn cố truy cập các tệp này. Tôi không thấy điểm của tryLock nếu bạn không thể gọi nó nếu tập tin bị khóa. –

+1

Đoán của tôi là các ứng dụng gốc có thể có nhiều khóa hạn chế hơn các khóa có sẵn trong JVM. – sylvain

0

tài liệu chia sẻ accross quá trình khá phức tạp đặc biệt là khi không sử dụng hệ thống tập tin chuyên dụng (như GFS có thể) .. Tôi không nghĩ rằng Java khóa API có thể giúp bạn nhiều, tôi nghĩ rằng bạn đang trên đúng cách với ý tưởng của bạn về chiến lược thử/thất bại ... Sử dụng java 7 bạn có thể sử dụng WatchService để theo dõi các thay đổi của tập tin và sau đó hành động như được nêu trong yêu cầu kinh doanh của bạn ... Loại hệ thống nào bạn sử dụng? Windows giữ xử lý trên các tệp trong thời gian vĩnh cửu ...

HTH Jerome

+0

Thật vậy, tôi đã có một chủ đề WatchService nghe cho các sự kiện FS, chỉ chạy trên Windows trong thời gian này. Dù sao tôi biết rằng sẽ không có một cách để truy cập vào các tập tin bị khóa, nhưng tôi ngạc nhiên không có một API trong java.io hoặc java.nio để kiểm tra khả năng truy cập của họ. – sylvain