Avatar billede freddy04 Nybegynder
12. oktober 2005 - 10:03 Der er 8 kommentarer og
1 løsning

Filer og filter

Hejsa,
Jeg har kikket på koden i svaret fra _carsten i dette spørgsmål: http://www.eksperten.dk/spm/590294

Jeg prøver at lave en lignende ting der finder alle .mp3 filer i den angivne folder og underfoldere. Men problemet opstår når man vælger rod-drev fx c eller d, så går der noget galt. Men det virker fint nok hvis man angiver en folder.
Hvordan kan det være, er det fordi der bliver for mange foldere at gennemløbe? Kan man ikke gøre noget ved det?
Avatar billede arne_v Ekspert
12. oktober 2005 - 13:25 #1
der burde ikke vær enogle problemer med roden

du har ikke \ problemer ?
Avatar billede freddy04 Nybegynder
12. oktober 2005 - 13:32 #2
Nej det mente jeg jo heller ikke, men når jeg vælger roden så får jeg problemer jo. Jeg har brugt denne, dog hvor brugeren vælger dir med filechooser, men det er underordnet:
Det virker som sagt fint når jeg vælger en "rigtig" folder, men når jeg vælger et rod-directory går den galt


import java.io.File;
import javax.swing.JOptionPane;

public class LocateFiles {
    private int numberOfFiles = 0;
   
    public LocateFiles() {
        String svar = JOptionPane.showInputDialog(null,"Indtast dit Mp3 basedir" ) ;
        File path = new File(svar);
        File[] dir = path.listFiles();
       
        for(int x=0;x < dir.length;x++) {
            if(dir[x].isDirectory()) {
                System.out.println("Directory:\t " + dir[x].toString());
                listMyFiles(dir[x]);
            }
            else{
                System.out.println("File:\t\t " + dir[x].toString());
                numberOfFiles++;
            }
        }
       
        System.out.println("Antal fundne filer er: " + numberOfFiles);
    }
   
    private void listMyFiles(File path){
        File[] dir = path.listFiles();
        for(int x=0;x < dir.length;x++) {
            if(dir[x].isFile()) {
                System.out.println("File:\t\t " + dir[x].toString());
                numberOfFiles++;
            }
            else
                listMyFiles(dir[x]);
        }
    }
   
    public static void main(String[] args) {
        new LocateFiles();
    }
}
Avatar billede freddy04 Nybegynder
12. oktober 2005 - 13:33 #3
\ burde ikke være årsagen når jeg bruger filechooser, og det er også det samme når jeg kører eksemplet ovenfor
Avatar billede arne_v Ekspert
12. oktober 2005 - 13:36 #4
skriver du C: eller C:\ ?
Avatar billede freddy04 Nybegynder
12. oktober 2005 - 13:46 #5
Har prøvet med begge dele. Fik pastet den forkerte kode - det er self denne her:

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class LocateFiles {
    private MyFilter filter;
    private static ArrayList filesFound;
   
    public LocateFiles() {
        String svar = JOptionPane.showInputDialog(null,"Indtast dit Mp3 basedir");
       
        File path = new File(svar);
        filter = new MyFilter("mp3");
        filesFound = new ArrayList();
       
        File[] dir = path.listFiles( filter );

        for(int x=0;x < dir.length;x++) {
            if(dir[x].isDirectory())
                listMyFiles(dir[x]);
            else
                filesFound.add(dir[x].toString());
        }
    }
   
    private void listMyFiles(File path){
        File[] dir = path.listFiles(filter);
       
        for(int x=0;x < dir.length;x++) {
            if(dir[x].isFile())
                filesFound.add(dir[x].toString());
            else
                listMyFiles(dir[x]);
        }
    }
   
    public static void main(String[] args) {
        new LocateFiles();
       
        System.out.println("Antal fundne filer er: " + filesFound.size());
       
        // Udskriv fundne filer
        for(int i = 0; i < filesFound.size(); i++)
            System.out.println("File:\t" + filesFound.get(i).toString());
    }
}




class MyFilter implements FilenameFilter{
    private String extension;
    private String fileSeparator;
   
    public MyFilter(String ext){
        extension = ext;
        fileSeparator = System.getProperty("file.separator");
    }

    public boolean accept(File file, String name) {
        if (name.endsWith( extension ))
            return true;
        else if ( new File(file.toString() + fileSeparator + name).isDirectory()){
            return true;
        }
            return false;
    }
}


Får denne fejl: Exception in thread "main" java.lang.NullPointerException
Avatar billede arne_v Ekspert
12. oktober 2005 - 14:00 #6
private void listMyFiles(File path){
        File[] dir = path.listFiles(filter);
        if(dir != null) {
            for(int x=0;x < dir.length;x++) {
                if(dir[x].isFile())
                    filesFound.add(dir[x].toString());
                else
                    listMyFiles(dir[x]);
            }
        } else {
            System.out.println(path + " gives null");
        }
    }
Avatar billede arne_v Ekspert
12. oktober 2005 - 14:01 #7
skriver:

C:\System Volume Information gives null
Avatar billede freddy04 Nybegynder
12. oktober 2005 - 14:08 #8
Ja så virker den når man skriver C:\ ikke med C: men det er vel også det filechooser returnerer.

Hvad gør den:  if(dir != null) du har sat ind. Jeg kan ikke rigtig se forskellen, hvis arrayet havde været tomt, ville for-løkken vel bare stoppe?

Tak for hjælpen, smid et svar
Avatar billede arne_v Ekspert
12. oktober 2005 - 14:10 #9
den håndterer at listFiles returnerer null for "C:\System Volume Information"

og svar
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