2012-02-18 25 views
24

Próbuję sprawdzić, czy określony plik java.io.ro jest otwarty przez program zewnętrzny. Na oknach I w ten prosty trick:Jak sprawdzić, czy plik jest otwarty przez inny proces (Java/Linux)?

try { 
    FileOutputStream fos = new FileOutputStream(file); 
    // -> file was closed 
} catch(IOException e) { 
    // -> file still open 
} 

wiem, że systemy UNIX pozwalają na otwieranie plików w wielu procesach ... Czy istnieje podobna sztuczka, aby osiągnąć ten sam wynik dla systemów UNIX?

Każda pomoc/siekać ceniona :-)

+0

masz absolutną rację ... ale potrzebuję tej funkcji do monitorowania stanu pliku (co robię z WatchServices w Javie 7). ale muszę też wykryć, kiedy dany plik zostanie ponownie zamknięty, aby go odblokować, aby inni użytkownicy mogli go ponownie edytować. – salocinx

+0

Czy możesz zadzwonić do 'lsof'? – tchrist

+0

To jest następna rzecz, którą spróbuję zrobić. lsof wydaje się istnieć na dość licznych dystrybucjach Linuksa. Otwarcie nowego procesu z lsof i odczytanie standardowego wyjścia wykona zadanie. Przedstawię swoje rozwiązanie jutro w tym wątku. wielkie dzięki! – salocinx

Odpowiedz

0

Można spróbować tego kodu typu semafor na blokadę plików przez @ZZ Coder

File file = new File(fileName); 
FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); 

FileLock lock = channel.lock(); 
try { 
    lock = channel.tryLock(); 
    // Ok. You get the lock 
} catch (OverlappingFileLockException e) { 
    // File is open by someone else 
    } finally { 
    lock.release(); 
} 
+1

wielkie dzięki, spróbuję! – salocinx

+0

moja przyjemność @NicolasBaumgardt :) –

+3

Działa to tylko wtedy, gdy wszyscy inni używają tego kodu. Wcale nierealistyczne. – tchrist

3

można uruchomić z programu Java użytkowego lsof że Unix mówi, który proces używa pliku, a następnie analizuje jego wyniki. Aby uruchomić program z kodu Java, użyj na przykład klas Runtime, Process, ProcessBuilder. Uwaga: Twój program Java nie będzie przenośny w tym przypadku sprzecznych koncepcji przenośność, więc zastanów się dwa razy, czy naprawdę trzeba to :)

+0

bardzo dziękuję za rozwiązanie. Wiem, że mam problemy z przenoszalnością - ale docelowe platformy są ograniczone do win/unix/mac. Mam nadzieję, że uda mi się znaleźć "solidną" strategię dla każdego systemu operacyjnego :-) – salocinx

+5

Większym problemem nie jest przenośność, ale nawet jeśli użyjesz lsof i przeanalizujesz jego wyjście i zobaczysz, że nikt nie używa tego pliku, nic nie gwarantuje, że na następnym linia w kodzie coś nie zostało otwarte plik –

8

Oto przykład jak używać lsof dla systemów UNIX:

public static boolean isFileClosed(File file) { 
    try { 
     Process plsof = new ProcessBuilder(new String[]{"lsof", "|", "grep", file.getAbsolutePath()}).start(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(plsof.getInputStream())); 
     String line; 
     while((line=reader.readLine())!=null) { 
      if(line.contains(file.getAbsolutePath())) {        
       reader.close(); 
       plsof.destroy(); 
       return false; 
      } 
     } 
    } catch(Exception ex) { 
     // TODO: handle exception ... 
    } 
    reader.close(); 
    plsof.destroy(); 
    return true; 
} 

Mam nadzieję, że to pomoże.

+0

nie działa na systemie Android. –

1

Dzięki za oryginalną sugestię. Mam jedną małą aktualizację, która jest nieco ważne do tej metody:

FileOutputStream fos = null; 
try { 
    // Make sure that the output stream is in Append mode. Otherwise you will 
    // truncate your file, which probably isn't what you want to do :-) 
    fos = new FileOutputStream(file, true); 
    // -> file was closed 
} catch(IOException e) { 
    // -> file still open 
} finally { 
    if(fos != null) { 
    try { 
     fos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Wiwaty, Gumbatron

+0

Uwaga: nie działa w systemie Linux. Nadal będziesz mógł otworzyć plik, nawet jeśli jest w użyciu. – mdewit

3

ten jeden powinien również pracować w systemach Windows. Ale uwaga, nie działa na Linuksa!

Powiązane problemy