2013-04-15 5 views
4

Я пробовал много примеров, но никто не работает. Я пробую это, но не работаю.Как определить, используется ли файл другим процессом (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; 
} 
+0

Что не работает? Какой результат вы получите от кода, который вы указали здесь? Какой результат вы ожидаете? –

+0

Я всегда могу заблокировать файл, даже если файл написан! –

+0

Ваш код не имеет смысла. Единственный раз, когда вы возвращаете true, является то, что 'FileChannel.lock()' возвращает 'null ', что он никогда не сможет сделать. Вы также просачиваете канал в этом случае, но это никогда не может произойти. Если вам удалось получить блокировку, это означает, что никто другой не заблокировал ее: наверняка вы хотите вернуть «истину» в этом случае? – EJP

ответ

2

Вы ловите исключение и возвращать ложь, то почему вы получаете ложными все время, сделать что-то за исключением или не поймать его, так что вы знаете, если было сгенерировано исключение, если вы ловите общее исключение и ложное возвращаемое значение не имеет смысла.

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

Хоу о вас просто доступ к филе и поймать 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) {    

} 
Смежные вопросы