2012-06-24 28 views
5

Estoy haciendo un programa en Java que supervisa y copia de seguridad de un directorio. De vez en cuando tengo que cargar archivos modificados al repositorio o descargarlos si hay una nueva versión de este. Para hacer esto, tengo que bloquear el archivo para que el usuario no pueda cambiar el contenido o eliminarlo. Actualmente estoy usando el código para bloquear el archivo:Archivo de bloqueo y eliminación

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

Sin embargo, si hay una nueva versión que tengo que borrar el archivo viejo y reemplazarlo por uno nuevo. Pero el bloqueo de archivos no me permite eliminar el archivo.

¿Debo desbloquearlo y borrarlo, escribir, confiando en que el usuario no escriba en el archivo? ¿O hay alguna otra forma de hacer esto?

+1

Esto no funcionará de todos modos. FileLocks no impide que el usuario cambie o elimine el archivo. Solo evitan que otros programas bloqueen el archivo. – EJP

Respuesta

3

Se puede truncar el archivo:

fileChannel.truncate(0); 

y luego escribir la nueva versión sobre ella, esto no crearía el espacio de tiempo en el que el usuario puede crear el archivo de nuevo.

De la documentación:

Si el tamaño dado es menor que el tamaño actual del archivo, el archivo se trunca , descartando cualquier byte más allá de la nueva final del archivo. Si el tamaño dado es mayor o igual que el tamaño actual del archivo , entonces el archivo no se modifica. En cualquier caso, si la posición del archivo de este canal es mayor que el tamaño dado, entonces se establece en ese tamaño.

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

+0

A menos que me falta la imagen completa, eso solo borra el contenido del archivo. Entonces eso no es lo que necesitaba. – user1308768

+0

* ¿Debo desbloquearlo y borrarlo, escribir y confiar en que el usuario no escriba en el archivo? ¿O hay alguna otra forma de hacerlo? * Respondí con * truncado * que puede usar después de que el archivo está bloqueado para borrar el contenido y escribir el nuevo contenido sobre él, por lo que no tiene el intervalo de tiempo entre eliminar el archive y cree el nuevo basado en el archivo que se sincronizará. –

+0

Solo agrego alguna explicación adicional ... por favor avíseme si necesita más aclaración. –

Cuestiones relacionadas