Avatar billede willi Nybegynder
27. maj 2003 - 21:51 Der er 43 kommentarer og
1 løsning

dirTree. Kan ikke udskrive filerne i biblioteket

Jeg ville gerne have listet filerne i bibliotekerne i programmet.
Men det går ikke rigtigt.
Det er ikke noget problem at få konstateret at der er en fil i biblioteket.
Men at få denne udskrevet kan jeg ikke.

Det er også underligt at der udskrives tre filer i sidste bibliotek. I hvert bibliotek er der én fil.

import java.io.*;

public class DirTree {

    public static void main(String[] argv) {
        DirTree dt = new DirTree();
        if (argv.length == 0)
            dt.doDir("f:\\hjemmeside" );
        else for (int i = 0; i<argv.length; i++)
            dt.doDir(argv[i]);
    }

    /** doDir - handle one filesystem object by name */
    private void doDir(String s) {
        File f = new File(s);
        if (!f.exists()) {
            System.out.println(s + " does not exist");
            return;
        }
        if (f.isFile())
            doFile(f);
        else if (f.isDirectory())
        {
            System.out.println("\n[:" + f.getName()+"]");
            if( f !=null)
            System.out.println("ikke tom");
            String objects[] = f.list();
            for (int i=0; i<objects.length; i++)
                doDir(s + f.separator + objects[i]);
        } else
            System.err.println("Unknown: " + s);
    }

    /** doFile - process one regular file. */
    private static void doFile(File f) {
        System.out.println("  " + f.getName());
    }
}

Udskrift:

[:hjemmeside]
ikke tom

[:hjemmesideSub]
ikke tom
  File

[:Ny mappeSub]
ikke tom

[:Ny mappeSub2]
ikke tom
  File
  File
  File

Forslag?
Avatar billede _carsten Nybegynder
27. maj 2003 - 21:59 #1
Prøv med:  dt.doDir("f:\\hjemmeside\\." );
Avatar billede magoo20000 Nybegynder
27. maj 2003 - 22:03 #2
Det tror jeg ikke hjælper
Avatar billede _carsten Nybegynder
27. maj 2003 - 22:05 #3
Det virker ellers hos mig.

Kompiler willi's kode og prøv
Avatar billede magoo20000 Nybegynder
27. maj 2003 - 22:09 #4
Jeg har lavet et testdirectory i c:\. Det hedder test. Under test ligger der test2. Under test2 ligger test3. Der ligger filer i test og test3. Jeg får listet nogle af filerne fra test under test3.
Avatar billede magoo20000 Nybegynder
27. maj 2003 - 22:10 #5
Altså nogle af de filer, der ligger under test, bliver udskrevet, så det ser ud som om de ligger under test3.
Avatar billede magoo20000 Nybegynder
27. maj 2003 - 22:14 #6
Jeg havde denne gamle kode til at ligge:


import java.io.File;
import java.io.*;

public class FileSystem extends File {
    // Constructor
    public FileSystem( String name ) {
        super( name );
    }

    // Output file name with indentation
    public void printName( int depth ) {
        for ( int i = 0; i < depth; i++ )
            System.out.print( "\t" );
        System.out.println( getName() );
    }

    // Public driver to list all files in directory
    public void listAll() {
        listAll( 0 );
    }

    // Recursive method to list all files in directory
    private void listAll( int depth ) {
        printName( depth );

        if ( isDirectory() ) {
            String[] entries = list();

            for ( int i = 0; i < entries.length; i++ ) {
                FileSystem child = new FileSystem( getPath()
                        + separatorChar + entries[i] );
                child.listAll( depth + 1 );
            }
        }
    }

    public long size() {
        long totalSize = length();

        if ( isDirectory() ) {
            String[] entries = list();
            for ( int i = 0; i < entries.length; i++ ) {
                FileSystem child = new FileSystem( getPath()
                        + separatorChar + entries[i] );
                totalSize += child.size();
            }
        }

        return totalSize;
    }

    static public void main( String[] args ) {
        FileSystem f;

        if ( args.length == 0 )
            f = new FileSystem( "c:\\k" ); // brug . for current dir.
        else
            f = new FileSystem( args[0] );

        f.listAll();
        System.out.println( "Total bytes: " + f.size() );
    }
}

Det virker!
Avatar billede _carsten Nybegynder
27. maj 2003 - 22:15 #7
Sådan havde jeg ikke lige testet den, men jeg får samme resultat som dig,
Det bliver rodet sammen !
Avatar billede magoo20000 Nybegynder
27. maj 2003 - 22:16 #8
Du skal blot rette
f = new FileSystem( "c:\\k" ); // brug . for current dir.
til det der er relevant for dig.
Avatar billede willi Nybegynder
27. maj 2003 - 22:17 #9
Det hjælper ikke rigtig som magoo2000 skriver.
Filerne udskrives ikke i det bibliotek hvori de ligger.
Det er problemet.
Avatar billede magoo20000 Nybegynder
27. maj 2003 - 22:18 #10
Ja, det er en god ide at teste med flere sub-dirs med filer hist og her.

Willi >> Der er noget logisk ukorrekt i din kode. Brug min kode - den er gennemtestet og virker (jeg har brugt den flere gange).
Avatar billede arne_v Ekspert
27. maj 2003 - 22:26 #11
Et alternativt og noget kortere forslag:

import java.io.*;

public class DirTree {

    public static void main(String[] argv) {
        for (int i = 0; i < argv.length; i++) {
            process("", argv[i]);
        }
    }

    private static void process(String indent, String name) {
        File f = new File(name);
        if (f.isDirectory()) {
            System.out.println(indent + "[" + f.getName() + "]");
            String list[] = f.list();
            for (int i = 0; i < list.length; i++) {
                process(indent + "  ", name + f.separator + list[i]);
            }
        } else if (f.isFile()) {
            System.out.println(indent + f.getName());
        }
    }
}
Avatar billede _carsten Nybegynder
27. maj 2003 - 22:29 #12
>magoo20000 Din kode er absolut OK

Men kan også en sjov ting:
Hvis du laver directory  a\b\c\d så gør den ikke et directory færdigt
Når den møder filer startende med 'b' går den til diretory B og fortsætter
indtil den møder filer startende med 'c' så går den til diretory C osv.

Til sidst gør den directory A færdig
Avatar billede willi Nybegynder
27. maj 2003 - 22:30 #13
Magoo20000.
Det virker ikke helt...
Der kommer ikke der korrekte liste frem (se udskriften for neden)

import java.io.File;
import java.io.*;

public class FileSystem extends File {
    // Constructor
    public FileSystem( String name ) {
        super( name );
    }

    // Output file name with indentation
    public void printName( int depth ) {
        for ( int i = 0; i < depth; i++ )
            System.out.print( "\t" );
        System.out.println( getName() );
    }

    // Public driver to list all files in directory
    public void listAll() {
        listAll( 0 );
    }

    // Recursive method to list all files in directory
    private void listAll( int depth ) {
        printName( depth );

        if ( isDirectory() ) {
            String[] entries = list();

            for ( int i = 0; i < entries.length; i++ ) {
                FileSystem child = new FileSystem( getPath()
                        + separatorChar + entries[i] );
                child.listAll( depth + 1 );
            }
        }
    }

    public long size() {
        long totalSize = length();

        if ( isDirectory() ) {
            String[] entries = list();
            for ( int i = 0; i < entries.length; i++ ) {
                FileSystem child = new FileSystem( getPath()
                        + separatorChar + entries[i] );
                totalSize += child.size();
            }
        }

        return totalSize;
    }

    static public void main( String[] args ) {
        FileSystem f;

        if ( args.length == 0 )
            f = new FileSystem( "f:\\hjemmeside" ); // brug . for current dir.
        else
            f = new FileSystem( args[0] );

        f.listAll();
        System.out.println( "Total bytes: " + f.size() );
    }
}
/* -----------------------udskriften-------------------------

hjemmeside
    hjemmesideSub
        File
    Ny mappeSub
        Ny mappeSub2
            File
        File
    File
Total bytes: 14816

-----------------------udskriften slut---------------------


...men biblioteket ser sådan ud:

hjemmeside
        File
    hjemmesideSub
        File
    Ny mappeSub
        File
        Ny mappeSub2
        File
Der er én fil i hvert bibliotek       
   

*/
Avatar billede _carsten Nybegynder
27. maj 2003 - 22:33 #14
arne_v's alternativ kan samme trick
Avatar billede willi Nybegynder
27. maj 2003 - 22:34 #15
Men hvad så Arne?
Hvad med path. Hvor skriver jeg den :-)
Avatar billede arne_v Ekspert
27. maj 2003 - 22:36 #16
Som argument.

Du kan også snuppe noget fra din oprindelige kode:

if (argv.length == 0) {
    process("f:\\hjemmeside" );
}
Avatar billede arne_v Ekspert
27. maj 2003 - 22:42 #17
carsten>

Er det ikke bare en naturlig følge af at filer på PC ikke er sorteret ?
Avatar billede magoo20000 Nybegynder
27. maj 2003 - 22:45 #18
Jeg mener da stadig min kode er helt fin.

Følgende mener jeg da er korrekt.

--k
    --axis.jar
    --commons-discovery.jar
    --commons-logging.jar
    --iaik_jce.jar
    --jaxrpc.jar
    --jsse.jar
    --log4j-1.2.4.jar
    --saaj.jar
    --Test
        --Test2
            --AccountHandler.java
            --AccountHandler_Stub.class
            --AccountNumber.class
            --AccountNumber.java
            --Amount.class
    --weblogic.jar
    --weblogic_client.jar
    --wlicommon.jar
    --wsdl4j.jar
    --xercesImpl.jar
    --xmlParserAPIs.jar
    --xmlx.jar
Total bytes: 44968808
Avatar billede willi Nybegynder
27. maj 2003 - 22:46 #19
Hmmm...
Jeg stopper for idag...
vender tilbage imorgen
Avatar billede _carsten Nybegynder
27. maj 2003 - 22:49 #20
Jo - tror bare ikke det er willi's ide med spørgsmålet !

Kommentar: willi
27/05-2003 22:30:00
hjemmeside
        File
    hjemmesideSub
        File
    Ny mappeSub
        File
        Ny mappeSub2
        File

Har en ide om at han ønsker hver gjort færdig inden fortsættes !
Avatar billede _carsten Nybegynder
27. maj 2003 - 22:51 #21
Tror også jeg stopper for idag, jeg springer hver andet ord over, kan jeg se!
Avatar billede _carsten Nybegynder
27. maj 2003 - 22:55 #22
>magoo20000

Ikke et eneste ondt ord om din kode - den perfekt og OK!
Bare lige for at slå det fast.
Avatar billede arne_v Ekspert
27. maj 2003 - 23:27 #23
Hvis filer altid skal komme før directories så skal man lave noget
specielt for at kunne håndtere det.

F.eks. denne her med to løkker:

import java.io.*;

public class DirTree2 {

    public static void main(String[] argv) {
        for (int i = 0; i < argv.length; i++) {
            process("", argv[i]);
        }
    }

    private static void process(String indent, String name) {
        File f = new File(name);
        System.out.println(indent + "[" + f.getName() + "]");
        String list[] = f.list();
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isFile()) {
                System.out.println(indent + "  " + list[i]);
            }
        }
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isDirectory()) {
                process(indent + "  ", name2);
            }
        }
    }
}
Avatar billede willi Nybegynder
28. maj 2003 - 14:56 #24
arne_v. Skulle jeg ikke føje det til:
File f = new File(name);
File f = new File("f://Hjemmeside");
Avatar billede arne_v Ekspert
28. maj 2003 - 14:58 #25
Du kan godt tilføje den logik at hvis der ikek angives
noget directory så tager du et default directory.
Avatar billede arne_v Ekspert
28. maj 2003 - 15:00 #26
Jeg tog det ikke med, fordi jeg ville fokusere meget på
kernen i problemet.

Du havde jo styr på den default værdi allerede i den kode
du postede i.f.m. spørgsmålet, så det fandt jeg uinteressant.

Jeg er en stor tilhænger af så simple programmer som muligt
til at illustrere principperne.
Avatar billede willi Nybegynder
28. maj 2003 - 15:07 #27
Styr på ??!!
Jeg har faktisk ikke styr på noget som helst i.f.m. programering.
Jeg kan højst gennemskue hvad der sker i en kode (nogle gange).
Avatar billede arne_v Ekspert
02. juni 2003 - 20:29 #28
Har du fået det til at virke ?
Avatar billede willi Nybegynder
03. juni 2003 - 09:45 #29
Nej. det har jeg ikke arne_v.
Men jeg har heller ikkekigget på det i nogle dage.
Det gør jeg iløbet af idag og vender tilbage eller bryder samme ;-)
Avatar billede willi Nybegynder
03. juni 2003 - 21:58 #30
Der er flere ting jeg ikke kan gennemskue.
Først og fremmest mener jeg argumentet File f = new File("f://hjemmeside");
skal liste filer i dette dir. Men det bliver ikke gjort.
En anden ting er "separator".
Er det en metode? (som ligger i .io class'en).
Avatar billede arne_v Ekspert
03. juni 2003 - 22:03 #31
separator i File er en member variabel som indeholder directory
adskillelses tegnet.
Avatar billede arne_v Ekspert
03. juni 2003 - 22:05 #32
File f = new File("f:/hjemmeside");
String list[] = f.list();

eller:

File f = new File("f:\\hjemmeside");
String list[] = f.list();

skal finde alle filer i directory.

Men kun to når det er backslash - en slash er nok !
Avatar billede willi Nybegynder
03. juni 2003 - 22:13 #33
Der kommer absolut intet frem. Hverken dir eller filer:

import java.io.*;

public class DirTree2 {

    public static void main(String[] argv) {
        for (int i = 0; i < argv.length; i++) {
            process("", argv[i]);
        }
    }

    private static void process(String indent, String name) {
       
        //File f = new File("f://hjemmeside");
        File f = new File("f:/hjemmeside");
          String list[] = f.list();
        System.out.println(indent + "[" + f.getName() + "]");
        //String list[] = f.list();
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isFile()) {
                System.out.println(indent + "  " + list[i]);
            }
        }
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isDirectory()) {
                process(indent + "  ", name2);
            }
        }
    }
}
Avatar billede arne_v Ekspert
03. juni 2003 - 22:17 #34
Prøv med:

import java.io.*;

public class DirTree2 {

    public static void main(String[] argv) {
        for (int i = 0; i < argv.length; i++) {
            process("", argv[i]);
        }
    }

    private static void process(String indent, String name) {
     
        File f = new File(name);
        System.out.println(indent + "[" + f.getName() + "]");
        String list[] = f.list();
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isFile()) {
                System.out.println(indent + "  " + list[i]);
            }
        }
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isDirectory()) {
                process(indent + "  ", name2);
            }
        }
    }
}

og så kald programmet med:

java DirTree2 f:/hjemmeside
Avatar billede arne_v Ekspert
03. juni 2003 - 22:18 #35
Programmet forventer et argument på kommando-linien !
Avatar billede arne_v Ekspert
03. juni 2003 - 22:20 #36
For default værdi brug:

import java.io.*;

public class DirTree2 {

    public static void main(String[] argv) {
        if(argv.length > 0) {
            for (int i = 0; i < argv.length; i++) {
              process("", argv[i]);
            }
        } else {
            process("", "f:/hjemmside");
        }
    }

    private static void process(String indent, String name) {
     
        File f = new File(name);
        System.out.println(indent + "[" + f.getName() + "]");
        String list[] = f.list();
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isFile()) {
                System.out.println(indent + "  " + list[i]);
            }
        }
        for (int i = 0; i < list.length; i++) {
            String name2 = name + f.separator + list[i];
            if ((new File(name2)).isDirectory()) {
                process(indent + "  ", name2);
            }
        }
    }
}
Avatar billede willi Nybegynder
03. juni 2003 - 22:20 #37
Det er måske her arne_v at jeg ikke har fulgt enkelteheden.
Jeg anvender UltraEdit som jeg også compilere med.
Jeg prøver at finde ud af det med dos promten
Avatar billede willi Nybegynder
03. juni 2003 - 22:24 #38
Så langt så godt.
Den skriver filerne ud i det første bibliotek. Men ikke i underbibliotekerne.
Avatar billede arne_v Ekspert
03. juni 2003 - 22:24 #39
Så brug den sidste variant med default værdi.

Jeg synes bare at det er en skam at hardcode stien ind i
programmet.
Avatar billede willi Nybegynder
03. juni 2003 - 22:25 #40
Det er måske til at finde ud af efterhånden.
Dos kommandoen kan også køres inde fra UltraEdit
Avatar billede willi Nybegynder
03. juni 2003 - 22:27 #41
Men jeg stopper for idag.
Vender tilbage i løbet af imorgen
Avatar billede arne_v Ekspert
03. juni 2003 - 22:29 #42
Hos mig udskriver de hele træet.
Avatar billede willi Nybegynder
04. juni 2003 - 09:27 #43
Det virker helt perfekt arne_v.
Men er process ikke et beskyttet ord i java.
Det fremgår dog ikke af api sepcifikationen (jeg kan ikke finde det). Men er registreret som sådan i UltraEdit.
Tak for hjælpen.
Avatar billede arne_v Ekspert
04. juni 2003 - 09:31 #44
Det er ikke et reserveret ord jævnfør http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#229308,
men ellers vælger du da bare et andet navn.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester