Hirdetés

Új hozzászólás Aktív témák

  • floatr
    veterán

    Sziasztok!

    Kellene egy kis segítség nekem. Van egy egyszerű Java program, ami csak annyit csinál, hogy sok kis fájlt másol egyik helyről a másikra. Naponta. Mivel elég sok van, ezért úgy kellene megoldani, hogy csak azokat másolja ami már nincs meg a másik helyen. Ezt a következőképpen oldottuk meg:

    //Másolás függvénye:
    public void masolas(File src, File dest)
    throws IOException {
    //Meg vizsgáljuk, hogy mappa-e:
    if (src.isDirectory()) {
    //Megpróbáljuk létrehozni a mappát (ha van, akkor nem csinál semmit)
    dest.mkdir();
    //Listába rendezzük a mappa tartalmát:
    String files[] = src.list();
    //Majd egyesével végigmegyünk rajta:
    for (String file : files) {
    //Elkészítjük a fájlokat:
    srcFile = new File(src, file);
    destFile = new File(dest, file);
    //Rekurzív másolás:
    masolas(srcFile, destFile);
    }
    } else {
    try {
    Files.copy(src.toPath(), dest.toPath());
    System.out.println("Másolás: " + src);
    } catch (FileAlreadyExistsException ex) {
    System.out.println("Ez a fájl már meg van: " + src);
    }
    }
    }

    Viszont így is körülbelül 15 perc alatt megy végig a fájlokon, ha meg van minden akkor is. Meg kellene gyorsítani. Ötletek?

    Kb így néz ki a struktúra:

    mappaneve1: fajl1, fajl2, fajl3
    mappaneve2: fajl1
    mappaneve3: fajl1 ... faj10

    Szóval van olyan mappa ami 10-15 fájlt is tartalmaz és ezek közül sok valószínűleg nem is változik. Arra gondoltam, hogy át kellene úgy alakítani, hogy először megnézi a mappa méretét és ha stimmel a kettő, akkor "bele se lép". Szerintetek ez kivitelezhető? Vagy azt is csak úgy tudja, hogy belelép és összeszámolja a tartalmát. Ha ez nem életképes, akkor valakinek van más ötlete?

    Amikor egy alkalmazás lekérdezi a könyvtár méretét, akkor vagy shell parancsot használ (ami nem túl hordozható megoldás), vagy szépen végignyálazza rekurzívan a belsejét. A leggyakrabban azt szokták csinálni, hogy a megadott útvonalat első körben beolvassák egy nagy listába, és minden elemhez tárolják a méretét, és az utolsó módosítás dátumát. A könyvtárakat nem is feltétlenül szükséges ebben a listában tárolni, mert az mkdirs rekurzívan létrehozza azokat, vagy esetleg a feltérképezéskor érdemes lehet már eleve létrehozni őket. Aztán második menetben összehasonlítod a méret/dátum értékeket, és ha nem stimmel, akkor másolsz. Akkor már csak a lista elemein kell végigfutni, és tudsz becsülni végrehajtási időt is.

Új hozzászólás Aktív témák