File - is being used by another process

0

Czesc,
mam taki problem ze przy probie otworzenia FileInputStream wywala mi:

(The process cannot access the file because it is being used by another process)

System op: windows. Plik nie jest otwarty przez zadne inne narzedzie. Obiekt File jest tworzony w innej klasie, a potem przekazywany do innej metody. Probowalam rowniez uzyc RandomAccessFile, FileChannel i Lock'a, a otrzymalam ten sam blad..

czy ktos z Was ma moze dla mnie jakies wskazowki?

pzdr,
misty

0

Pokaz kod jak to robisz,
a moze otworzyłaś raz plik bez zrobienia close() strumienia i on ciagle jest w stanie 'otwartym' ?

0

hej, robie close. Oto kod:

 
 public boolean process(File file) {
    prepareAnalyseStatus(0, file);
}

//Dalej, metoda prepareAnalyseStatus:

    private void prepareAnalyseStatus(int action, File file) throws FileNotFoundException, IOException {

              FileReader fileReader = new FileReader();
              String status = fileReader.getReader(file).readLine();
            fileReader.closeReading();
}
//zas getReader to tworzy i zwraca mi buffer:

    public BufferedReader getReader(File file) throws FileNotFoundException, IOException {
        fis = new FileInputStream(file);
        dis = new DataInputStream(fis);
        br = new BufferedReader(new InputStreamReader(dis));

return br;
}

//zas closeReading:

    public void closeReading() throws IOException {
        if (br != null) {
            br.close();
        }
    }

0

Sprawa jest dziwna moim zdaniem. Kopiuje plik, mam listenera ktory nasluchuje czy pojawil sie nowy plik - jesli tak to otwiera FileInputStream (+ logika) i wlasnie proba otworzenia FileInputStream wywala blad. Tylko ze zanim go utworze to wypisuje sobie wartosci:

        System.out.println("READ "+file.canRead());
        System.out.println("WRITE "+file.canWrite());
        System.out.println("EXE "+file.canExecute());
 

i wszystkie sa na true! i zaraz po nich mam komunikat:
(The process cannot access the file because it is being used by another process)

jak to jest mozliwe ze rzuca mi tym wylatkiem skoro canRead(), canWrite() i canExecute() zwracaja mi true??

0

Metoda canRead() zwraca zapewne atrybut pliku, a nie informację czy już teraz możesz czytać z pliku. Skoro plik przed chwila powstał, to może jeszcze jest używany przez proces, który go utworzył.

0

Tak wlasnie jest. Kopiuje sobie duzy plik (ponad 200 mega) i z jednej str te 3 metody mi pokazuja juz ze moge na nim operacje robic, z drugiej str kopiowanie jeszcze trwa.. napisalam objecie, ale straasznie mi sie nie podoba:

 
    private boolean isReady(File file) {

        while (test(file) == null) {

            try {
                Thread.sleep(SLEEP_TIME);
            } catch (InterruptedException e) {
                logger.error(e);
            }

        }

        logger.info("RELEASED!");
        
        return true;
    }

    private FileInputStream test(File f) {

        try {
            fis = new FileInputStream(f);
        } catch (FileNotFoundException e) {
            logger.info("File still used by another process. Sleep for " + SLEEP_TIME + " ms ");
        }

        return fis;

    }

czyli dopoki utworzenie FileInputStream bedzie rzucalo FileNotFoundException to program bedzie zasypial, a potem probowal jeszcze raz. Strasznie mi sie to nie podoba, ale nie znalazlam zadnego innego rozwiazania. Ludzie pisza by uzywac locka, ale w moim przypadku to tez rzuci exception. Wiec nie przyychodzi mi nic innego jak zasypiac na jakis czas..

pzdr,
misty

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