Avatar billede acw Nybegynder
12. februar 2005 - 12:22 Der er 9 kommentarer og
1 løsning

Søge efter undermapper i en given path

Hej. Jeg er ved at lave et lille program der leder efter alle mp3 filer i en given sti, dvs den også søger i undermapper, og under-under mapper osv. Problemet er bare, at den algoritme jeg har lavet, giver nogle dubletter af mapper, så det ser ud som om jeg har flere filer end jeg rent faktisk har...

---------
code here:
.........

import java.io.*;
import java.util.*;

public class locate {
  File f;
  File[] files;
  filter filter = new filter();
 
  public locate(File ff) {
    getFiles(ff);
  }

  public void getFiles(File path) {
    File file;
    try {
      filter.listFiles(path);
      ArrayList a = getDirs(path);
      Iterator ita = a.iterator();
      while(ita.hasNext()) {
        file = (File) ita.next();
        //making a recursive call
        getFiles(file);
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
  }



public ArrayList getDirs(File dir) {
  files = dir.listFiles();
  ArrayList dirs = new ArrayList();
  for(int x=0;x < files.length;x++) {
    if(files[x].isDirectory()) {
      dirs.add(files[x]);
      filter.listFiles(files[x]);
    }
  }
  return dirs;
}


  public static void main(String[] args) {
    BufferedReader in = new BufferedReader(
          new InputStreamReader(System.in));
        System.out.print("Indtast dit Mp3 basedir: ");
        try {
          new locate(new File(in.readLine()));
        }
        catch (IOException e) {
          System.err.println(e);
        }
  }
}

------------------------------------

metoden getDirs returnerer en ArrayList med de undermapper der er i en given sti.
Klassen filter returnerer bare filerne i den mappe den sættes til at kigge i, så intet mærkeligt der.
Det er i getFiles(File path) der skal ændres, da det er her det sner :)

På forhånd tak, Andreas
Avatar billede arne_v Ekspert
12. februar 2005 - 12:37 #1
Det er vel ikke vores gode gamle bekendte . og .. som driller dig ?
Avatar billede acw Nybegynder
12. februar 2005 - 12:43 #2
hvad mener du med det? den skifter jo dir automatisk...
Avatar billede _carsten Nybegynder
12. februar 2005 - 13:58 #3
Hvad med denne her, så skal du bare selv indsætte dit filter


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 arne_v Ekspert
12. februar 2005 - 14:22 #4
Jeg tænkte bare på om du fik talt .. med som subdir og det var derfor
du fik for mange filer.
Avatar billede arne_v Ekspert
12. februar 2005 - 14:22 #5
talt . med som subdir
Avatar billede arne_v Ekspert
12. februar 2005 - 14:24 #6
Og jeg forstår slet ikke de mange metoder.

For knap 2 år siden lavede jeg denne kode:

import java.io.*;
import java.util.*;

public class DirSub2 {
  public static void main(String[] args) {
      Vector v = new Vector();
      dir("C:\\java", v);
      for(int i = 0; i < v.size(); i++) {
          System.out.println((String)v.get(i));
      }
  }
  public static void dir(String s, Vector v) {
      File dir = new File(s);
      String[] dirlist = dir.list();
      for (int i = 0; i < dirlist.length; i++) {
        String fnm = dir + System.getProperty("file.separator") + dirlist[i];
        v.add(fnm);
        if ((new File(fnm)).isDirectory()) {
            dir(fnm, v);
        }
      }
  }
}

som løber gennem et directory træ.

[du bør kunne erstatte Vector med ArrayList uden videre]
Avatar billede _carsten Nybegynder
12. februar 2005 - 16:49 #7
Har du fået det til at virke ????
Avatar billede _carsten Nybegynder
12. februar 2005 - 17:23 #8
Her har du det hele incl. filter

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;
    }
}
Avatar billede acw Nybegynder
12. februar 2005 - 22:41 #9
hej...hvis i ser i toppen af min getFiles(File path) har jeg lavet en hovsa....

public void getFiles(File path) {
    File file;
    try {
      filter.listFiles(path); <-------- HER har jeg sat at den skal liste filer. Det skal jo ikke gøres her....
      ArrayList a = getDirs(path);
      Iterator ita = a.iterator();
      while(ita.hasNext()) {
        file = (File) ita.next();
        //making a recursive call
        getFiles(file);
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
Avatar billede acw Nybegynder
12. februar 2005 - 22:42 #10
Udover det lagde jeg filter.listFiles ned i while metoden og fjernede den fra getDirs metoden. Så virker det fint....
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