» »

[JAVA] Izpis imen vseh datotek iz direktorija in poddirektorijev

[JAVA] Izpis imen vseh datotek iz direktorija in poddirektorijev

Slovenet ::

Želim izpisati imena vseh datotek iz direktorija in poddirektorijev. Pri tem sem uporabil kodo, ki sem jo našel na strani https://dzone.com/articles/java-example.... Zadeva seveda ne izpiše vseh datotek. Kaj je narobe? V pogledu Output javi, da naj bi bilo nekaj narobe v treh vrsticah kode (označeno s komentarjem ?). Ob tem pa napiše še Java Result: 1.

public void listFilesAndFilesSubDirectories(String directoryName){

        File directory = new File(directoryName);

        //get all the files from a directory

        File[] fList = directory.listFiles();

        for (File file : fList){ // ?

            if (file.isFile()){

                System.out.println(file.getAbsolutePath());

            } else if (file.isDirectory()){

                listFilesAndFilesSubDirectories(file.getAbsolutePath()); // ?

            }

        }
    }

    public static void main (String[] args){

        ListFilesUtil listFilesUtil = new ListFilesUtil();

        //Windows directory example

        final String directoryWindows ="C://";

        listFilesUtil.listFilesAndFilesSubDirectories(directoryWindows); // ?

    }

    }
  • spremenilo: Slovenet ()

videc ::

Kaj pa ti misliš?
Mogoče tole: directoryLinuxMac? Ali, pač, kaj drugega?

Slovenet ::

videc je izjavil:

Kaj pa ti misliš?
Mogoče tole: directoryLinuxMac? Ali, pač, kaj drugega?

Tole sem popravil na directoryWindows. Ni to. Lahko je kaj v zvezi z izvršljivimi datotekami, bližnjicami itd..

Spura ::

Na neki tocki klices listFiles na necem kar ni folder.

Slovenet ::

Delam aplikacijo, ki naj bi izpisala imena vseh datotek iz direktorija in poddirektorijev. Aplikacija ima gumb (jButton)za izbiro začetnega imenika ter tekstovno polje (jTextField), kamor se zapiše izbrani začetni imenik, in tekstovno območje (jTextArea), kamor se izpisujejo imena datotek in imenikov.

S klikom na gumb preko gradnika tipa JFileChooser izberem začetni imenik. Vrednost začetnega imenika shranim v eno spremenljivko zacetniImenik, ki je tipa File. Nato kličem rekurzivno funkcijo displayDirectoryContents s parametrom zacetniImenik. Vsebina rekurzivne funkcije je takšna:

public void displayDirectoryContents(File directory) {
        try {
            File[] files = directory.listFiles();
            for (File file : files) {
                if (file.isDirectory()) {
                    if (jTextArea.getText().equals("")) {
                        jTextArea.setText("Directory: " + file.getCanonicalPath());
                    } else {                        jTextArea.setText(jTextArea.getText()+"\n"+"Directory: " + file.getCanonicalPath());
                        displayDirectoryContents(file);
                    }
                } else {
                    if (jTextArea.getText().equals("")) {
                        jTextArea.setText("File: " + file.getCanonicalPath());                        
                    }
                    else {                        jTextArea.setText(jTextArea.getText()+"\n"+"File: " + file.getCanonicalPath());                        
                    }                    
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (NullPointerException ex) {
            System.out.println(ex.getMessage());
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

Problem nastopi, ko je treba izpisati večje število imen datotek, ki so globoko po datotečnem drevesu. V tekstovno polje jTextField se takoj na začetku ne zapiše izbrani začetni imenik, obenem pa se sproti v tekstovno območje jTextArea ne izpisujejo imena datotek in imenikov.

Yacked2 ::

Evo: https://github.com/andrazjelenc/Directo...

pod "if (file.isDirectory())" dodaj else pa izpisuj file.getCanonicalPath()
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

Dzhimen ::

@Slovenet
Napako v kodi maš. Rekurzivni klic v 9. vrstici moraš premaknit izven "else"-a. Ker če se zgodi da je prvi najden File ravno direktorij, potem bo ta direktorij samo izpisalo (brez "\n"), funkcija pa ne gre rekurzivno izpisovat znotraj tega prvega direktorija ker maš rekurzivni klic samo v primeru, ko jTextField ni prazen.

Kodo sem stestiral na testnem direktoriju in zgleda da drugače deluje. Mel sem eno txt datoteko na 27. nivoju (Stiring poti je bil dolžine 257) in je pravilno izpisalo.

Lahko pa da je krivo to, da ta rekurzivna funkcija ne izpisuje nujno v takem vrstnem redu kot ti pričakuješ, ker je "depth-first" in če to kodo zaganjaš na velikem direktoriju zna bit da so te datoteke ki jih pogrešaš izgubljene nekje na sredini.

Yacked2 je izjavil:

Evo: https://github.com/andrazjelenc/Directo...

pod "if (file.isDirectory())" dodaj else pa izpisuj file.getCanonicalPath()


To ima že narejeno.

Zgodovina sprememb…

  • spremenil: Dzhimen ()

Slovenet ::

Dzhimen je izjavil:

@Slovenet
Napako v kodi maš. Rekurzivni klic v 9. vrstici moraš premaknit izven "else"-a. Ker če se zgodi da je prvi najden File ravno direktorij, potem bo ta direktorij samo izpisalo (brez "\n"), funkcija pa ne gre rekurzivno izpisovat znotraj tega prvega direktorija ker maš rekurzivni klic samo v primeru, ko jTextField ni prazen.

Tekstovno polje jTextField pred klicom rekurzivne funkcije nastavim na prazen niz. Klic funkcije displayDirectoryContents(file) sem premaknil izven pogoja
if (jTextArea.getText().equals("")) {/* izpis v jTextArea */} else {/* izpis v jTextArea */}
vendar še vedno ni želenega izpisa. V kolikor želim izpisati večje število imen datotek, ki so globoko po datotečnem drevesu, se v tekstovno polje jTextField takoj na začetku ne zapiše izbrani začetni imenik, hkrati pa se sproti v tekstovno območje jTextArea ne izpisujejo imena datotek in imenikov. Imena datotek in imenikov se v jTextArea zapišejo šele, ko rekurzivna funkcija pride do konca, torej do zadnje datoteke ali zadnjega imenika čisto na dnu datotečnega drevesa.
public void displayDirectoryContents(File directory) {
        try {
            File[] files = directory.listFiles();
            for (File file : files) {
                if (file.isDirectory()) {
                    if (jTextArea.getText().equals("")) {
                        jTextArea.setText("Directory: " + file.getCanonicalPath());
                    } else {                        jTextArea.setText(jTextArea.getText()+"\n"+"Directory: " + file.getCanonicalPath());
                    }
                    displayDirectoryContents(file);
                } else {
                    if (jTextArea.getText().equals("")) {
                        jTextArea.setText("     File: " + file.getCanonicalPath());                        
                    }
                    else {
jTextArea.setText(jTextArea.getText()+"\n"+"     File: " + file.getCanonicalPath());
                    }                  
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (NullPointerException ex) {
            System.out.println(ex.getMessage());
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

Zgodovina sprememb…

  • spremenilo: Slovenet ()

Slovenet ::

V tabeli podatkovne baze imam zapisana imena datotek in imena direktorijev. Rad bi izpisal iz tabele datoteke, ki so v določenem direktoriju. Spodnji primer izpisa ne izvede, oziroma kot rezultat vrne prazno množico, čeprav so v stolpcu directory zapisi C:\Users.

SELECT filename FROM table WHERE directory LIKE 'C:\Users';

Slovenet ::

Kaj pa v tem primeru?

SELECT filename FROM table WHERE directory LIKE 'C:\Users\Jozek';

igor0203 ::

SELECT filename FROM table WHERE directory LIKE 'C:\Users%';

Slovenet ::

igor0203 je izjavil:

SELECT filename FROM table WHERE directory LIKE 'C:\Users%';

Tole ne dela. Vzrok je v poševnici v levo.

Spura ::

Slovenet je izjavil:

Dzhimen je izjavil:

@Slovenet
Napako v kodi maš. Rekurzivni klic v 9. vrstici moraš premaknit izven "else"-a. Ker če se zgodi da je prvi najden File ravno direktorij, potem bo ta direktorij samo izpisalo (brez "\n"), funkcija pa ne gre rekurzivno izpisovat znotraj tega prvega direktorija ker maš rekurzivni klic samo v primeru, ko jTextField ni prazen.

Tekstovno polje jTextField pred klicom rekurzivne funkcije nastavim na prazen niz. Klic funkcije displayDirectoryContents(file) sem premaknil izven pogoja
if (jTextArea.getText().equals("")) {/* izpis v jTextArea */} else {/* izpis v jTextArea */}
vendar še vedno ni želenega izpisa. V kolikor želim izpisati večje število imen datotek, ki so globoko po datotečnem drevesu, se v tekstovno polje jTextField takoj na začetku ne zapiše izbrani začetni imenik, hkrati pa se sproti v tekstovno območje jTextArea ne izpisujejo imena datotek in imenikov. Imena datotek in imenikov se v jTextArea zapišejo šele, ko rekurzivna funkcija pride do konca, torej do zadnje datoteke ali zadnjega imenika čisto na dnu datotečnega drevesa.

Handlerji eventov od Swinga se izvajajo v istem threadu, kot repaint klici, torej se med tem, ko se tvoja koda izvaja, vmesnik ne osvezuje, ampak se osvezi sele ko se tvoja funkcija zakljuci.

Slovenet ::

Slovenet je izjavil:

igor0203 je izjavil:

SELECT filename FROM table WHERE directory LIKE 'C:\Users%';

Tole ne dela. Vzrok je v poševnici v levo.

Podatki v tabeli so v obliki C:\Users\Jozek\datoteka.txt. Imam pa aplikacijo, s katero dostopam do baze. Sedaj bi pa rad s stavkom SELECT izbral iz tabele podatke, ki so enaki določenemu vnešenemu nizu, recimo C:\Users\Jozek\Program.exe. Težava je očitno s temi poševnicami v levo. Kako naj to rešim?

GupeM ::

Slovenet je izjavil:

Slovenet je izjavil:

igor0203 je izjavil:

SELECT filename FROM table WHERE directory LIKE 'C:\Users%';

Tole ne dela. Vzrok je v poševnici v levo.

Podatki v tabeli so v obliki C:\Users\Jozek\datoteka.txt. Imam pa aplikacijo, s katero dostopam do baze. Sedaj bi pa rad s stavkom SELECT izbral iz tabele podatke, ki so enaki določenemu vnešenemu nizu, recimo C:\Users\Jozek\Program.exe. Težava je očitno s temi poševnicami v levo. Kako naj to rešim?

Poskusi z:
SELECT filename FROM table WHERE directory LIKE 'C:\\Users%';

Torej dve poševnici nazaj. Ena poševnica nazaj je tako imenovan escape character. Uporablja se recimo če bi hotel iskati znak % v tekstu. Ker je % rezerviran znak za "karkoli", to pomeni da ga moraš označiti z escape characterjem '\'. Ker pa je tudi '\' sam po sebi rezerviran znak, moraš tudi tega označiti z escape characterjem.

Zgodovina sprememb…

  • spremenil: GupeM ()

Slovenet ::

GupeM je izjavil:

Slovenet je izjavil:

Slovenet je izjavil:

igor0203 je izjavil:

SELECT filename FROM table WHERE directory LIKE 'C:\Users%';

Tole ne dela. Vzrok je v poševnici v levo.

Podatki v tabeli so v obliki C:\Users\Jozek\datoteka.txt. Imam pa aplikacijo, s katero dostopam do baze. Sedaj bi pa rad s stavkom SELECT izbral iz tabele podatke, ki so enaki določenemu vnešenemu nizu, recimo C:\Users\Jozek\Program.exe. Težava je očitno s temi poševnicami v levo. Kako naj to rešim?

Poskusi z:
SELECT filename FROM table WHERE directory LIKE 'C:\\Users%';

Torej dve poševnici nazaj. Ena poševnica nazaj je tako imenovan escape character. Uporablja se recimo če bi hotel iskati znak % v tekstu. Ker je % rezerviran znak za "karkoli", to pomeni da ga moraš označiti z escape characterjem '\'. Ker pa je tudi '\' sam po sebi rezerviran znak, moraš tudi tega označiti z escape characterjem.

Tole dela nekako znotraj vmesnika phpMyAdmin, ne dela pa znotraj javanske aplikacije.

Sergio ::

Tole si poglej: https://xkcd.com/1638/
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

GupeM ::

Ja če pa v Javi sestavljas native query, boš moral pa dati 4 sla she (\\\\). To pa zato, ker je \ tudi v Javi rezerviran znak.

Aja... Pa preberi si malo o escape characterjih.

Zgodovina sprememb…

  • spremenil: GupeM ()

Slovenet ::

GupeM je izjavil:

Ja če pa v Javi sestavljas native query, boš moral pa dati 4 sla she (\\\\). To pa zato, ker je \ tudi v Javi rezerviran znak.

Aja... Pa preberi si malo o escape characterjih.

Zamenjava enojne poševnice v levo z dvojno poševnico v levo ni bila uspešna. Odločil sem se, da vse poševnice v levo zamenjam z znakom, ki ni dovoljen za ime datoteke ali imenika. V bazi bodo tako imena datotek in imenikov, ki bodo imeli nedovoljene znake. Po iskanju po bazi pa nato izvedem pretvorbo nedovoljenih znakov v ustrezen dovoljen znak.

Sergio ::

@Slovenet: Preberi si še enkrat kaj je napisal GupeM. Bolje je da razumeš kaj počneš, kot pa da greš firefightat nek problem tam kjer ni treba.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

GupeM ::

@Slovenet: Saj si rekel, da ti znotraj vmesnika phpMyAdmin zadeva dela. Ker ti SQL baza prevede \\ v \. V Javi pa moraš napisati \\\\ zato, ker ti Java \\\\ prevede v \\, to pošlje bazi, baza pa potem \\ prevede v \.

Nekako sumim, da imaš pri delu z Javo problem s presledki, ki jih Java rada predstavi kot '%20', kar pa bazam ponavadi ni ravno všeč.

Slovenet ::

Razvoj aplikacije gre proti koncu. Sedaj bi pa rad natisnil vse podatke iz neke tabele (JTable) tako, da bi se natisnila celotna vsebina celic te tabele. Stolpcev je dvanajst, vsebina v njih pa zasede širino, ki je večja od širine ekrana. Poskusil sem na spodnji način in izbral ležeče tiskanje (Landscape). Iskal sem že neke rešitve, vendar tisto ni dalo želenih rezultatov. Kaj moram še spremeniti, da se bo vsebina celic natisnila v želeni velikosti črk? Ob tem pa ne bi rad, da se spremeni velikost črk v sami tabeli.

MessageFormat header = new MessageFormat("My Header");
MessageFormat footer = new MessageFormat("My Footer {0,number,integer}");
table1.print(JTable.PrintMode.FIT_WIDTH, header, footer);


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10317142 (7890) black ice
»

Java skeniranje map in podmap

Oddelek: Programiranje
61068 (957) nightrage
»

java net beans pomoč

Oddelek: Programiranje
121486 (1374) i33a
»

[Java] Shranjevanje vrsto razredov v List

Oddelek: Programiranje
6995 (893) Beezgetz
»

[NALOGA][JAVA]Vodoravni met

Oddelek: Programiranje
112604 (2293) BCSman

Več podobnih tem