Java - блокировка файла для монопольного доступа - PullRequest
3 голосов
/ 30 декабря 2011

Моя проблема заключается в следующем: я использую WatchService, чтобы получать уведомления о новых файлах в определенной папке, теперь, если файл перемещается / копируется или создается в указанной папке, запускается событие и имя нового файл возвращается. Проблема теперь в том, что, если я пытаюсь получить доступ к файлу, и он еще не полностью там (например, копия все еще выполняется), возникает исключение. Я пытался сделать что-то вроде этого:

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

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

Теперь, как можно заблокировать файл в Java для действительно эксклюзивного доступа?

1 Ответ

3 голосов
/ 30 декабря 2011

Для меня утверждение

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

возвращает исключение FileNotFoundException, если я не могу получить блокировку файла. Я ловлю файл notfound исключение и лечить его ...

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 ..

...