2013-03-08 40 views
7

Tôi có một số mã được thiết kế để mở tệp chính cục bộ, bổ sung và lưu tệp bằng cách ghi đè tệp chính và ghi đè bản sao được ghi bảo vệ trên vị trí mạng có thể truy cập . Điều này được thực hiện bằng cách lưu tệp đã sửa đổi vào tệp tạm thời và sau đó sao chép trên hai tệp khác.Tệp Java.copy thay thế tệp xóa hiện có hoàn toàn

String tempFileName= "File.tmp"; 
String fileName= "File.xlsm"; 
String serverPath="\\\\network path\\"; 
File serverFile = new File(serverPath+fileName); 

Files.copy(Paths.get(tempFileName),Paths.get(fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

if(serverFile.exists()){serverFile.setWritable(true, false);} 

Files.copy(Paths.get(tempFileName),Paths.get(serverPath+fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

serverFile.setWritable(false,false); 

Files.delete(Paths.get(tempFileName)); 

Mã này hoạt động tốt nhưng không có ngoại lệ nhưng với tệp vị trí mạng đã bị xóa. Các tập tin tổng thể địa phương được lưu và cập nhật một cách chính xác nhưng tập tin nên tồn tại trên mạng chỉ đơn giản là đi.

Điều gì khiến việc này trở nên khó khăn hơn là tôi không thể tái tạo vấn đề này trong bất kỳ trường hợp được kiểm soát nào. Vì vậy, tôi yêu cầu bạn cho bất kỳ hướng dẫn về cách điều này có thể xảy ra từ một tập tin sao chép/ghi đè lên hoạt động.

Cảm ơn bạn

UPDATE:

Tôi đã có một linh cảm và kiểm tra bản ghi truy cập mạng vào đường dẫn tập tin máy chủ. Việc xóa tệp xảy ra nếu và chỉ khi tệp đang được người dùng khác không phải là người tạo truy cập nhưng không phải lúc nào cũng được. Một lần nữa, mặc dù điều này được truy cập như chỉ đọc để người dùng có tệp mở không ảnh hưởng đến việc ghi đè lên một phiên bản mới và phần lớn thời gian không. Đào sâu hơn có vẻ như đôi khi nếu và chỉ khi các tập tin được mở bởi người dùng khác và java đang cố gắng ghi đè lên các tập tin một ngoại lệ AccessDenied được ném và tập tin sẽ bị xóa.

Tôi tin rằng đây phải là lỗi trong setWritable() hoặc Files.copy (hoặc kết hợp) vì tệp sẽ không bị xóa trong bất kỳ trường hợp nào và isWritable() trả về đúng mỗi lần. Tôi đã thử các phương pháp khác để thiết lập/UN-thiết lập quyền đọc chỉ và đã có sản phẩm nào. Các công việc hiện tại xung quanh mà tôi có tại chỗ chỉ cần nắm bắt ngoại lệ và vòng lặp cho đến khi tập tin bị xóa và một bản sao mới được đặt ra. Điều này hoạt động nhưng thực sự là một hack vì vậy nếu có ai có bất kỳ giải pháp tốt hơn/đề nghị tôi chào đón họ.

+0

Tệp của bạn lớn đến mức nào? Có lẽ nó có thể được gây ra bởi một ngắt kết nối mạng trong khi bạn đang sao chép các tập tin? – Byron

+0

@Byron Đó là lý thuyết làm việc duy nhất của tôi nhưng tôi đã chạy thử nghiệm kết nối mạng trong một khoảng thời gian dài mà không bỏ qua – David

+0

@Byron Ngoài ra, tệp sẽ lớn nhưng cuối cùng chỉ ~ 500k – David

Trả lời

-2

Xem How does FileLock work?, bạn có thể làm một cái gì đó như:

  1. Chờ tập tin để trở nên có sẵn
  2. Khóa nộp
  3. Overwrite/xóa/khác
  4. Mở khóa (nếu có)

Điều này sẽ ngăn chặn truy cập của người dùng khác trong quá trình sửa đổi tệp.

+1

Nếu và chỉ khi những người dùng khác cũng sử dụng khóa tệp. – EJP

+0

Tôi cho rằng nó phụ thuộc vào việc triển khai hệ thống tập tin nhưng trong thử nghiệm cục bộ của tôi, nếu tôi khóa một tệp, hãy rút ngắn khóa bằng tay một cách thủ công, tôi không thể xóa, ghi hoặc đổi tên tệp đó trong khi khóa đang mở.Vì vậy, không chắc chắn lý do tại sao tôi đã downvoted ở đây! – Fallso

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