2013-04-15 25 views
4

我已經嘗試了很多例子,但沒有人能夠正常工作。 我嘗試這個,但不工作。我試過也用tryLock()。它總是返回false。爲什麼?如何確定文件是否正在被另一進程使用(Java)

private boolean checkCompleteFile(File f) 
{   
    RandomAccessFile file = null; 
    FileLock fileLock = null; 

    try 
    { 
     file = new RandomAccessFile(f, "rw"); 
     FileChannel fileChannel = file.getChannel(); 

     fileLock = fileChannel.lock(); 
     if (fileLock != null) 
     { 
      fileLock.release(); 
      file.close(); 
      return false; 
     } 

    } 
    catch(Exception e) 
    { 
     return false; 
    } 

    return true; 
} 
+0

什麼不起作用?你從你提供的代碼中得到了什麼結果?你期望什麼結果? –

+0

即使正在寫入文件,我也可以始終鎖定文件! –

+0

你的代碼沒有意義。只有當FileChannel.lock()返回null時,才返回true,這是它永遠不會做到的。在這種情況下,你也在泄漏渠道,但它永遠不會發生。如果你設法取得鎖定,那就意味着沒有其他人鎖定它:當然你想在這種情況下返回'true'? – EJP

回答

2

您捕獲異常並返回false,這就是爲什麼你會得到錯誤的時候,做一些與異常或不抓,它讓你知道,如果一個異常被拋出,如果你趕上一般例外虛假的返回值並不真正有意義。

try { 
    lock = channel.tryLock(); 
    // ... 
} catch (OverlappingFileLockException e) { 
    // File is already locked in this thread or virtual machine 
} 
lock.release(); 
channel.close(); 

你凸輪只是嘗試訪問該文件,並捕捉異常,如果它失敗:

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 (SecurityException e) { 
    isLocked = true; 
}catch (Exception e) { 
    // handle exception 
}finally { 
    try { 
     if(fos!=null) { 
      fos.close(); 
     } 
    }catch(Exception e) { 
     //handle exception 
    } 
} 

注意,RandomAccessFile類拋出:

FileNotFoundException異常 -

如果模式是「r」但是給定的字符串是如果模式與「RW」 開始,但給定的字符串不表示現有的可寫常規 文件和名稱的新常規文件,不能創建,或不表示現有的常規文件,或者如果一些 打開或創建文件時發生其他錯誤。

拋出:SecurityException -

如果存在安全管理器,並且其checkRead 方法拒絕讀取文件訪問或者該模式爲「RW」和 安全管理器的checkWrite方法拒絕寫入文件訪問

+0

這表示是否「文件已被鎖定在此線程或虛擬機中」,但我想知道該文件是否由某人打開。 –

+0

後關於你只是訪問fila並捕獲一個AccessDeniedException? – CloudyMarble

+0

怎麼樣?我試過,但不行... –

0

如何使用linux命令?

lsof -p 

該命令將顯示文件打開狀態,您可以解析它來檢查誰使用它。

+0

這應該是一個評論而不是答案 – Alepac

+0

這是一個了不起的答案。 – dotancohen

0

嘗試使用這樣的:

try { 
    @SuppressWarnings("resource") 
    FileChannel channel = new RandomAccessFile(fileToRead, "rw").getChannel(); 
    //This method blocks until it can retrieve the lock. 
    FileLock lock = channel.lock(); // Try acquiring the lock without blocking. 
    try { 
     lock = channel.tryLock(); 
    } catch (OverlappingFileLockException e){ 

    } 
    lock.release(); //close the file. 
    channel.close(); 
} catch (Exception e) {    

} 
相關問題