2012-06-24 22 views
5

java'da bir dizini izleyen ve yedekleyen bir program yapıyorum. Zaman zaman, değiştirilmiş dosyaları depoya yüklemem veya yeni bir sürümü varsa indirmem gerekiyor. Bunu yapmak için dosyayı kilitlemek zorundayım, böylece kullanıcı içeriği değiştiremez veya silemez. Şu anda dosyayı kilitlemek için bu kodu kullanıyorum:Dosya kilitleme ve silme

 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(); 
     } 

Ancak eski dosyayı silmek ve yenisiyle değiştirmek zorunda yeni bir sürümü varsa. Ancak Dosya kilidi dosyayı silmeme izin vermiyor.

Kilidi açıp silmeli miyim, kullanıcının dosyaya yazmayacağına güvenmek mi yazıyor? Yoksa bunu yapmanın başka bir yolu var mı?

+1

Zaten bu işe yaramaz. FileLocks, kullanıcının dosyayı değiştirmesini veya silmesini engellemez. Sadece diğer programların dosyayı kilitlemesini engeller. – EJP

cevap

3

Dosyayı kesmek olabilir:

fileChannel.truncate(0); 

ve sonrasında üzerinde yeni sürümü yazma, bu kullanıcı dosyayı yeniden oluşturabilir hangi zaman aralığını oluşturmak olmaz. belgelerine

:

verilen boyut dosyanın yeni ucuna ötesinde herhangi bayt atarak ardından dosya kesilir dosyanın geçerli boyutu, daha az ise. Belirtilen boyut ise, dosyanın geçerli boyutu 'dan büyük veya ona eşitse, dosya değiştirilmez. Her iki durumda da, bu kanalın dosya konumu, belirtilen boyuttan büyükse, bu boyuta ayarlanır.

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

+0

Büyük resmi kaçırmadığım sürece, sadece dosyanın içeriğini siler. Yani ihtiyacım olan şey bu değil. – user1308768

+0

* Kilidi açıp silmeli mi, kullanıcının dosyaya yazmayacağına güvenerek mi yazmalıyım? Ya da bunu yapmanın başka bir yolu var mı? * Ben * kesik ile cevap verdiğinizde * dosya içeriğini temizlemek ve yeni içeriği üzerine yazmak için kilitlendikten sonra kullanabilirsiniz, böylece silme arasındaki zaman boşluğuna sahip değilsiniz. senkronize edilecek dosyaya göre yeni bir dosya oluşturun ve oluşturun. –

+0

Sadece biraz ek açıklama ekliyorum ... lütfen daha fazla açıklama gerekiyorsa lütfen bana bildirin. –