NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Zkontrolování rodiče složky, která byla smazána

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:10.8.2017 13:42

Zdravím nudím se a proot si dělám prográmek na smazání prázdných složek v pc. Mám tuto metodu.

public void showFolders(String path) {
        File[] listOfFolders = new Folder(path).listFiles();
        for (File folder : listOfFolders) {
            if (folder.listFiles() != null) {
                if (folder.isDirectory()) {
                    if (!folder.isHidden()) {
                        countFolders++;
                        Folder subFolder = new Folder(path + "\\" + folder.getName());
                        if (subFolder.listFiles().length == 0) {
                            System.out.println("Prazdna -" + subFolder.getPath());
                            subFolder.delete();
                        } else {
                            System.out.println("Plna -" + subFolder.getPath());
                            showFolders(subFolder.getPath());
                        }
                    }
                }
            }
        }
    }

Funguje bez problému, ale problém nastává tehdy, když mám například složku Hry/Hra1/config(práz­dná). Složku config to smaže ale už to nesmaže složku Hra1. Myslel jsem, že by to mohlo být takto:

if (subFolder.listFiles().length == 0) {
        ...
} else {
        showFolders(subFolder.getParent());
}

Budu rád za každou radu díky.

Editováno 10.8.2017 13:42
 
Odpovědět
10.8.2017 13:42
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:10.8.2017 14:25

operátor & ti moc neříká, viď? víc ifů víc adidas....
jinak hlavně pro takovéto účely se používá rekurze.
Pomocí rekurze projdeš celou adresářovou strukturu a to, že se něco vykoná nebo ne, to už je na tvém kódu.

Nahoru Odpovědět
10.8.2017 14:25
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Petr Kasnal
Neaktivní uživatel:10.8.2017 14:35

Rekurze + nejdriv zanorit a az pri vynoreni pokud je prazdna smazat.
Princip jako:

projit_slozku
projit_potomky
if bez_potomku
smazat

Nahoru Odpovědět
10.8.2017 14:35
Neaktivní uživatelský účet
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Lubor Pešek
Petr Kasnal:10.8.2017 14:46

Moc se omlouvám. Operátor & samozřejmě znám. Jak jsem řekl program si píšu jen tak a na správnost jsem moc nekoukal samozřejmě je mi jasné, že by tam měl být a budu to tak dělat. A nejsem si jistý ale já zde neopoužívám rekurzi ?

 
Nahoru Odpovědět
10.8.2017 14:46
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Neaktivní uživatel
Petr Kasnal:10.8.2017 14:48

Díky za odpověď. Stejně jako k předešlému dotazu se chci zeptat. Příde mi, že de zde používám rekurzi ne ? A chápu ten tvůj nápad a tk nějak to mam vždyť já si vezmu složku tam se podívam do jiné složky a pokud je prázdná tak jí smažu.

 
Nahoru Odpovědět
10.8.2017 14:48
Avatar
Odpovídá na Petr Kasnal
Neaktivní uživatel:10.8.2017 15:19

Vec se ma tak, rekurzi pouzivas - v tom kodu se tezko orientuje kvuli kaskade bloku, tak jsem to prehledl - moje chyba.

ALE - prepis to tak (samozrejme jestli chces), ze nejdriv bez ohledu na to, jestli je slozka prazdna nebo neco obsahuje na ni zavolas tu funkci showFolders (mozna bys to mel prejmenovat deleteEmptyFolders) a potom, co se tohle zavola, tak teprve cekuj jestli je prazdna, pokud jo, tak ji taky smaz.

Samotna funkce deleteEmptyFolders by mohla fungovat nejak tak, ze dostane cestu, sestavi seznam slozek uvnitr, zavola na kazdou slozku uvnitr rekurzivne sama sebe a pak zkontroluje jestli je prazdna. Kazda rekurze ma mit ukoncovaci podminku a tady to bude stav, kdy zadana cesta neobsahuje dalsi podadresare, v tomto momente jsme na konci stromu - zadne dalsi volani, jen kontrola, jestli je dana slozka prazdna - paklize ano -> smazat ji a return.

Takze neco jako:

del_empty_dir(dir)
  for sub_dir in dir
    del_empty_dir(dir + sub_dir)
  if is_empty(dir)
    delete(dir)
  return

Moznosti je ale samozrejme vicero, zalezi jak na to chces jit - tuhle verzi muzes zavolat jako del_empty_dir('/').

Doufam, ze jsem nikde neudelal fundamentalni chybu, nemam moznost se soustredit uplne naplno.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
10.8.2017 15:19
Neaktivní uživatelský účet
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Neaktivní uživatel
Petr Kasnal:10.8.2017 15:53

Hele dík moc skvělej nápad :) Vysvětleno fkt suprově a udělam si to trošinku jinak ale díky tobě to snad udělam moc děkuju :)

 
Nahoru Odpovědět
10.8.2017 15:53
Avatar
Odpovídá na Petr Kasnal
Neaktivní uživatel:10.8.2017 16:10

Rad jsem pomohl.

Nahoru Odpovědět
10.8.2017 16:10
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.