Jak sprawdzić czy plik nie jest zajęty przez inną aplikację?

0

Problem może trywialny ale jakoś nie umiem znaleźć rozwiązania ani w google ani na forum.

Piszę program w javie do sortowania filmów, jako że miałem problem z kodeckami w java to program uruchamia dany film za pomocą:

Desktop.getDesktop().browse(new URI(...sciezka do pliku...));

i wyswietla się w Media Player Classic gdy chce przenieść do któregoś z katalogów to moj program odpala następny czeka chwilę aby zwolnił się dostep do pliku i przenosi.
Jeśli zbyt wcześnie nastąpi próba kopiowania wyskakuje komunikat błędu:

 Proces nie może uzyskać dostępu do pliku, ponieważ jest on używany przez inny proces.

W jaki sposób można sprawdzić czy jest już możliwy dostęp do pliku czy jeszcze nie? Tak, żeby nie czekać niepotrzebnie długo tylko w pętli co ileś ms spradzać.

0

Jakiś Timer i metody klasy File (canWite, canRead,...)?

0

Do tej pory używałem timera na 3000ms a teraz chciałbym sprawdzać co 100ms czy już można. Bo czasem szybciej zwalnia się dostęp a czasem wolniej.

Metody canWrite, canRead, canExecute sprawdzałem i daja odpowiedz TRUE nawet gdy plik jest uruchomiony i wyświetla się film.

Może problem w tym, że nie sprawdzam pliku bezpośrednio z dysku tylko może java tworzy odwolanie do pliku i sprawdzam to odwołanie?
Robię to w taki sposób.

        File plik = new File(...sciezka...);
        
        boolean status = plik.canWrite();
        if (status) {
            System.out.println(plik + " canWrite - " + status);
        } else {
            System.err.println(plik + " canWrite - " + status);
        }

        boolean status1 = file.canRead();
        if (status1) {
            System.out.println(plik + " canRead - " + status1);
        } else {
            System.err.println(plik + " canRead - " + status1);
        }
0

To może przechwyć rzucony wyjątek i w jego obsłudze spróbuj jeszcze raz wywołać funkcję?

0

Szukam rozwiązania w jaki sposób zbadać w jakim "stanie" jest plik na dysku w środowisku Windows i co się z nim dzieje. Nie tylko żeby program zadziałał bo działa przy użyciu timera.

1

A próbowałeś np. tego?

File file = new File("file.txt");
boolean fileIsNotLocked = file.renameTo(file);

Tutaj więcej przykładów: http://stackoverflow.com/questions/1500174/checking-if-a-file-locked-in-java

0

Teraz sprawdzam to:

boolean fileIsLocked = Files.isReadable(filePath);

ale też też coś nie chce działać

Zaraz sprawdze te twoje. Ciekawi mnie czy nie pozmienia mi nazw plików.

0

Hehe ta metoda działa.

File file = new File("file.txt");
boolean fileIsNotLocked = file.renameTo(file);

Szkoda, że trochę na około tzn sprawdza co innego ale działa w pożądany sposób.

Wielkie dzięki.

ps. zastanawiam
się tylko dlaczego nie da się sprawdzić czy plik jest zablokowany, może dlatego że nie jest, jest tylko używany przez inną aplikację.

1

Zależy w jakim trybie inna aplikacja otwiera plik (shared or exclusive). U mnie z filmami jest skojarzona aplikacja Media Player Classic, mogę odtwarzany film edytować programem Notepad++. Nie mogę natomiast zmienić nazwy ani nie mogę usunąć.

0

Ja też używam Media Player Classic omyłkowo wpisałem WMP, już poprawiam.

2

Poprawne tego sprawdzenie nie polega na sprawdzenie nie polega na sprawdzeniu czy można zmienić nazwę pliku ale na przeskanowaniu uchwytów otwartych plików w systemie i sprawdzeniu czy któryś z nich nie jest uchwytem tego pliku. Jeżeli w Java można używać WinApi (pewnie można ale trzeba pokombinować) i interesuje Cie rozwiązanie pod Windows to kiedyś w Delphi (język tu nie ważny bo da sie przetłumaczyć na wszystko w czym można używać WinApi bo z tych funkcji korzysta) napisałem coś podobnego dla określonego procesu a Ty musiałbyś sprawdzić wszystkie a to jest deczko skomplikowane więc z przetłumaczeniem tego na Java byłaby kupa roboty i to zadanie tylko dla masochistów:
http://4programmers.net/Forum/1146048
No chyba że Java ma coś wbudowanego ale tego to nie wiem.

0

Właśnie tak, sprawdzenie czy da się zmienić nazwę pliku to połowiczne rozwiązanie, które jest w miarę satysfakcjonujące w tym konkretnym przypadku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1