2012-06-24 31 views
5

Tôi đang tạo một chương trình trong java để theo dõi và sao lưu một thư mục. Đôi khi tôi phải tải lên các tệp đã sửa đổi vào kho lưu trữ hoặc tải xuống nếu có phiên bản mới của nó. Để thực hiện việc này, tôi phải khóa tệp để người dùng không thể thay đổi nội dung hoặc xóa nó. Hiện nay tôi đang sử dụng mã này để khóa các tập tin:Khóa và xóa

 file = new RandomAccessFile("C:\\Temp\\report.txt", "rw"); 

     FileChannel fileChannel = file.getChannel(); 
     fileLock = fileChannel.tryLock(); 
     if (fileLock != null) { 
      System.out.println("File is locked"); 

      try{ 

      //Do what i need  

      }catch (Exception e){//Catch exception if any 
       System.err.println("Error: " + e.getMessage()); 
      } 
     } 
     else{ 
      System.out.println("Failed"); 
     } 
    } catch (FileNotFoundException e) { 
     System.out.println("Failed"); 
    }finally{ 
     if (fileLock != null){ 
      fileLock.release(); 
     } 

Tuy nhiên nếu có một phiên bản mới tôi phải xóa các tập tin cũ và thay thế bằng một hình mới. Nhưng Khóa tệp không cho phép tôi xóa tệp.

Tôi có nên mở khóa và xóa ghi đi, tin tưởng rằng người dùng sẽ không ghi vào tệp? Hay có cách nào khác để làm điều này?

+1

này sẽ không hoạt anyway. FileLocks không ngăn người dùng thay đổi hoặc xóa tệp. Chúng chỉ ngăn các chương trình khác khóa tập tin đó. – EJP

Trả lời

3

Bạn có thể cắt file:

fileChannel.truncate(0); 

và sau đó viết phiên bản mới trên nó, điều này sẽ không tạo ra sự chênh lệch thời gian trong đó người dùng có thể tạo ra các tập tin một lần nữa.

Từ tài liệu:

Nếu kích thước nhất định là ít hơn kích thước hiện tại của tập tin sau đó tập tin được cắt ngắn, loại bỏ bất kỳ byte ngoài khi kết thúc mới của tập tin. Nếu kích thước đã cho lớn hơn hoặc bằng kích thước hiện tại của tệp thì tệp đó không bị sửa đổi. Trong cả hai trường hợp, nếu tệp của kênh này có vị trí lớn hơn kích thước đã cho thì nó được đặt thành kích thước đó.

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

+0

Trừ khi tôi bỏ lỡ bức tranh lớn, chỉ xóa nội dung của tập tin. Vì vậy, đó không phải là những gì tôi cần. – user1308768

+0

* Tôi có nên mở khóa và xóa nó viết đi, tin tưởng rằng người dùng sẽ không viết trong tập tin? Hoặc là có cách nào khác để làm điều này? * Tôi trả lời với * truncate * mà bạn có thể sử dụng sau khi tập tin bị khóa để xóa nội dung và ghi nội dung mới lên đó, vì vậy bạn không có khoảng cách thời gian giữa xóa và tạo tệp mới dựa trên tệp sẽ được đồng bộ hóa. –

+0

Tôi chỉ cần thêm một số giải thích bổ sung ... vui lòng cho tôi biết nếu bạn cần giải thích rõ hơn. –

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