Problem z kopiowanie plików w Javie

0

Witam

Mam własną metodę której podaję dwa argumenty jeden z nich to katalog na serwerze ftp a drugi to ścieżka do katalogu w komputerze gdzie ma ten katalog z serwera zapisać.

Oczywiście algorytm jest rekurencyjny i pozwala skopiować (mam taką nadzieję) katalog z zawartością.

Oto jego całość:

private void copyAll(String katalog, String desc)
{
        try {
                f.changeWorkingDirectory(katalog);
                FTPFile[] pliki = f.listFiles();
                
                desc = desc + "/" + katalog;
                
                File td = new File(desc);
                td.mkdir();
                
                for(int i=0; i<pliki.length; i++)
                    System.out.println(pliki[i].getName());
                
                for(int i=0; i<pliki.length; i++)
                {
                    if(!pliki[i].isDirectory())
                    {
                        InputStream in = null;
                    try {
                            in = f.retrieveFileStream(pliki[i].getName());
                            System.out.println(pliki[i].getName());
                            FileOutputStream out = new FileOutputStream(desc +"/"+ pliki[i].getName());
                            byte[] buff = new byte[4096];
                            int count = 0;
                            while ((count = in.read(buff)) != -1) 
                                out.write(buff, 0, count);
                                
                            in.close();
                            out.close();
                        
                        } catch (IOException ex) { } 
                           
                    }
                     else
                        {
                            copyAll(pliki[i].getName(), desc+pliki[i].getName());
                        }
                }

Jednak po skopiowaniu jednego czasem przedostatniego pliku z katalogu funkcja wylatuje. W katalogu na serwerze znajduje się kilka plików które dla próby chcę ściągnąć.

Od słowa try do słowa catch część skopiowałem z innego postu z forum.

Kod wylatuje przy: while "((count = in.read(buff)) != -1)" z wyjątkiem:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Dodam że pliki istnieją a pierwszy "for" wyświetla wszystkie pliki w katalogu.

Nie wiem o czym zapomniałem albo czego nie wiem. Albo można to zrealizować w inny sposób ??:)

Dzięki za pomoc :)

0

Najwidoczniej zmienna in jest nullem. Nie wiem z czego korzystasz ale moze FTPFile.isDirectory nie zwraca dobrych wartosci, i dla katalogu probujesz wziac strumien ktorego nie ma?

0

FTPFile.isDirectory jest dobre :]

ale nie mam pojęcia dlaczego wskakuje mi to do null-a

Czy istnieje jakiś inny sposób aby zapisać plik na dysku :>

0

Jakiej klasy jest zmienna f ? Wygląda, że metoda retrieveFileStream() może zwrócić null nie rzucając wyjątkiem. Spróbuj tak:

   int ileProb=10;
   while (in==null && ileProb<=10)
   {
       in = f.retrieveFileStream(pliki[i].getName());
       Thread.sleep(100);
       ileProb++;
   }

Po wyjściu z powyższej pętli (pętla się nie skompiluje - trzeba dodać try i catch) powinieneś sprawdzać czy in jest równy null - jeśli jest to nie kopiować. Trzeba się zastanowić co z plikami których się nie dało skopiować (poinformować użytkownika, zapamiętać nazwy i spróbować jeszcze raz, ...).

0

zaraz to sprawdzę ;] f to instancja FTPClient :)

0

Nie w metodzie zapisywaia jest problem, nie ma innej - mam na mysli to ze musisz dostac input stream i skopiowac i tyle. A ze metoda ta zwraca null w pewnych przypadkach - poczytaj w api dlaczego.

0

Nie wiem czy pytanie jest jeszcze aktualne. Zamiast tak

   in = f.retrieveFileStream(pliki[i].getName());
   FileOutputStream out = new FileOutputStream(desc +"/"+ pliki[i].getName());
   byte[] buff = new byte[4096];
   int count = 0;
   while ((count = in.read(buff)) != -1)
         out.write(buff, 0, count);                               
   in.close();
   out.close();

zrób tak

   FileOutputStream out=new FileOutputStream(desc+File.separator+pliki[i].getName());
   f.retrieveFile(pliki[i].getName(),out)
   out.close();
0

Już sobie z problemem poradziłem, na troszkę inny sposób, a mianowicie zmieniłem metodę klasy FTPClient i wygląda to tak:

FileOutputStream out = new FileOutputStream(desc + "/" + pliki[i].getName());
f.retrieveFile(pliki[i].getName(), out);
out.close();

Dzięki za podpowiedzi :)

0

Latwiej by bylo jakbys powiedzial na starcie ze korzystasz z commons ftp, a nie za luddzie musza sie domyslac.
Nie uzywaj "/", uzywaj File.separator, jak to napisal wczesniej Bogdans.

0

Będę pamiętał :)

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