如何确定文件是否被另一个进程使用(Java)

我已经尝试过很多例子,但是没有人能工作。 我尝试这个,但不工作。

我也尝试使用tryLock() 。 它总是返回false。 为什么?

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

你捕捉到一个异常,并返回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方法拒绝对文件的写入访问

如何使用Linux命令?

 lsof -p 

该命令将显示文件打开状态,您可以解析它来检查谁使用它。

尝试使用这个:

 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) { }