2011-12-30 2 views
3

내 문제는 이것입니다 : WatchService을 사용하여 특정 폴더의 새 파일에 대한 알림을받습니다. 파일이 이동되거나 복사되거나 해당 폴더에 만들어지면 이벤트가 트리거됩니다. 새 파일의 이름이 반환됩니다. 문제는 현재 파일에 액세스하려고 시도했지만 아직 완전히 존재하지 않는다는 것입니다 (예 : 사본이 아직 진행 중임). 예외가 발생합니다. 내가 뭘하려고하는 것은이 그런 짓을했다 :자바 - 독점 액세스를 위해 파일 잠그기

잠금이 획득됩니다 경우에도 내가 다른 프로세스가 여전히 열린 핸들이 있기 때문에 파일에 쓸하려고하면
RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 
FileChannel fc = raf.getChannel(); 
FileLock lck = fc.lock(); 

하지만, 때로는 여전히 예외가 제기됩니다.

이제 어떻게 독점적 인 액세스를 위해 Java 파일을 잠글 수 있습니까? 내가 파일에 대한 잠금을 얻을 수없는 경우에 나를 위해

답변

3

, 문

RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 

는 FileNotFoundException이를 반환합니다. 나는 당신이 루프에서이 작업을 실행하고 파일에 대한 잠금을 얻을 때까지 기다릴 수

public static boolean isFileLocked(String filename) { 
    boolean isLocked=false; 
    RandomAccessFile fos=null; 
    try { 
     File file = new File(filename); 
     if(file.exists()) { 
      fos=new RandomAccessFile(file,"rw"); 
     } 
    } catch (FileNotFoundException e) { 
     isLocked=true; 
    }catch (Exception e) { 
     // handle exception 
    }finally { 
     try { 
      if(fos!=null) { 
       fos.close(); 
      } 
     }catch(Exception e) { 
      //handle exception 
     } 
    } 
    return isLocked; 
} 

... filenotfound 예외를 잡아 취급. 파일이 잠겨 있으면 라인

FileChannel fc = raf.getChannel(); 

는 결코 도달하지 않을까요? 던져진 FileNotFoundException을 받게됩니다 ..