2011-12-30 115 views
3

我的問題是這樣的:我使用WatchService來獲得關於特定文件夾中的新文件的通知,現在如果文件在所述文件夾中被移動/複製或創建,則觸發事件並返回新文件的名稱。現在的問題是,如果我嘗試訪問該文件並且尚未完全訪問(例如複製仍在進行中),則會引發異常。我試過是做這樣的事情:Java - 鎖定獨佔訪問的文件

RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); 
FileChannel fc = raf.getChannel(); 
FileLock lck = fc.lock(); 

但即使鎖被收購,有時仍然是一個異常被,如果我嘗試寫入文件,因爲另一個進程仍具有打開的句柄給它提出的。

現在,Java中的文件如何被鎖定以實現真正的獨佔訪問?

回答

3

對於我來說,語句

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

返回一個FileNotFoundException異常,如果我不能獲得該文件的鎖。我趕上filenotfound異常,並把它...

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

,你可以在一個循環中運行這一點,等到你在文件上的鎖。不會行

FileChannel fc = raf.getChannel(); 

如果文件被鎖定,永遠不會到達?你會得到一個FileNotFoundException拋出..