# Verzeichnis auslesen - Dateien werden zu oft gespeichert



## PattXterminator (2. Feb 2010)

Hallo,

ich hab folgendes Problem. Wenn ich versuche mit meinem Code einen Ordner auszulesen und alle beinhalteten Dateien in eine Liste zu speichern, werden die Datein zu oft reingeschrieben. Hier ist mal der Code:


```
public ArrayList searchFile(File dir, String endung)
    {
        if(dir.isDirectory())
        {
            File[] files = dir.listFiles();
            if(files != null) {
                for(int i = 0; i < files.length; i++)
                {
                    if(files[i].isDirectory())
                    {
                        matches.addAll(searchFile(files[i], endung));
                    }
                    if(files[i].getName().endsWith(endung))
                    {
                        matches.add(files[i]);
                    }
                }
            }
        }
        else
        {
            matches.add(dir);
        }
        return matches;
    }
```

Ich rufe jetzt diese Methode so auf: 
	
	
	
	





```
searchFile(new File("C:/Anime/Musik/"), ".wav")
```
In dem angegebenen Ordner sind diese Dateien enthalten (nach Alphabetischer Reihenfolge):

Albtraum.wav
Bloody Tears.wav
Bloody TearsBegin.wav
FFVI BattleTheme.wav
FFVI BattleThemeBegin.wav
Krias Theme.wav
Kiras ThemeBegin.wav
Neuer Ordner
Out Of Control.wav
Out Of CobtrolBegin.wav
The Gates Of Hell.wav

"Neuer Ordner" enthält:
Kiras Theme.wav
Kiras ThemeBegin.wav
Out Of Control.wav
Out Of ControlBegin.wav

Wenn ich die Methode aufrufe und danach die Elemente der Liste auslese kommt folgende ausgabe:

C:\Anime\Musik
C:\Anime\Musik\Albtraum.wav
C:\Anime\Musik\Bloody Tears.wav
C:\Anime\Musik\Bloody TearsBegin.wav
C:\Anime\Musik\FFVI Battle Theme.wav
C:\Anime\Musik\FFVI Battle ThemeBegin.wav
C:\Anime\Musik\Kiras Theme.wav
C:\Anime\Musik\Kiras ThemeBegin.wav
C:\Anime\Musik\Neuer Ordner\Kiras Theme.wav
C:\Anime\Musik\Neuer Ordner\Kiras ThemeBegin.wav
C:\Anime\Musik\Neuer Ordner\Out Of Control.wav
C:\Anime\Musik\Neuer Ordner\Out Of ControlBegin.wav
C:\Anime\Musik\Albtraum.wav
C:\Anime\Musik\Bloody Tears.wav
C:\Anime\Musik\Bloody TearsBegin.wav
C:\Anime\Musik\FFVI Battle Theme.wav
C:\Anime\Musik\FFVI Battle ThemeBegin.wav
C:\Anime\Musik\Kiras Theme.wav
C:\Anime\Musik\Kiras ThemeBegin.wav
C:\Anime\Musik\Neuer Ordner\Kiras Theme.wav
C:\Anime\Musik\Neuer Ordner\Kiras ThemeBegin.wav
C:\Anime\Musik\Neuer Ordner\Out Of Control.wav
C:\Anime\Musik\Neuer Ordner\Out Of ControlBegin.wav
C:\Anime\Musik\Out Of Control.wav
C:\Anime\Musik\Out Of ControlBegin.wav
C:\Anime\Musik\The Gates Of Hell.wav

Warum hat er denn jetzt die Titel alle zweimal reingeschrieben?

Vielen Dank für eure Hilfe.

MfG,
PattXterminator


----------



## diel2001 (2. Feb 2010)

Dann benutz doch einfach ein Set 


```
Set<String> set = new HashSet<String>(); //oder
 Set set = new HashSet();
```

Da gehen keine doppelten String Einträge rein


----------



## PattXterminator (2. Feb 2010)

Mit Sets hab ich aber noch gar nichts gemacht, von daher keine AHnung wie ich das anstellen soll...


----------



## eRaaaa (2. Feb 2010)

Zeig mal den kompletten Code, vor allem wie es zu dieser Ausgabe kommt...


----------



## OliverKroll (2. Feb 2010)

Wenn du eine lokale Variable "matches" verwendest, dann geht es:

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

public class Hauptprogramm
{
	public static ArrayList matches=new ArrayList();
	public static ArrayList liste1=new ArrayList();
	
	public static void main(String[] args)
	{
		liste1=searchFile(new File("src/pack1/"),"java");
		
		liste1=searchFile(new File("src/pack1/"),"java");
		
		System.out.println(liste1);
	}
	
	public static ArrayList searchFile(File dir, String endung)
    {
		ArrayList matches=new ArrayList();
		
        if(dir.isDirectory())
        {
            File[] files = dir.listFiles();
            if(files != null) 
            {
                for(int i = 0; i < files.length; i++)
                {
                    if(files[i].isDirectory())
                    {
                        matches.addAll(searchFile(files[i], endung));
                    }
                    if(files[i].getName().endsWith(endung))
                    {
                        matches.add(files[i]);
                    }
                }
            }
        }
        else
        {
            matches.add(dir);
        }
        return matches;
    }
}
```


----------



## PattXterminator (2. Feb 2010)

Also hier der komplette Code:


```
import java.util.ArrayList;

import java.io.File;

public class Player
{



  // Anfang Attribute
    private ArrayList<File> matches = new ArrayList<File>();
    private ClipStreamer streamer;
    private File dir;
    private int tracknummer;
    private boolean neuladen;
  // Ende Attribute


    public Player(String pVerzeichnis)
    {
        dir = new File(pVerzeichnis);
        tracknummer=0;
        neuladen=false;
        searchFile(dir, ".wav");
        for(int i=0; i<matches.size(); i++)
        {
            System.out.println(matches.get(i)+"");   //Hier ist dann die Ausgabe
        }
    }

  // Anfang Methoden

    public ArrayList searchFile(File dir, String endung)
    {
        if(dir.isDirectory())
        {
            File[] files = dir.listFiles();
            if(files != null) {
                for(int i = 0; i < files.length; i++)
                {
                    if(files[i].isDirectory())
                    {
                        matches.addAll(searchFile(files[i], endung));
                    }
                    if(files[i].getName().endsWith(endung))                            //
                    {
                        matches.add(files[i]);
                    }
                }
            }
        }
        else
        {
            matches.add(dir);
        }
        return matches;
    }
    
    //Ab hier ist es eigentlich nicht mehr relevant, da diese Methoden nur noch
    //in Verbindung mit einer anderen Klasse benötigt werden - das funktioniert alles einwandtfrei
    public File getFile(int pIndex)
    {
        return matches.get(pIndex);
    }
    
    public ArrayList getList()
    {
        return matches;
    }
    
    public void laden(int pIndex)
    {
        try
        {
            streamer.stop();
        }
        catch(Exception e)
        {

        }
        String pfad = (String)matches.get(pIndex).getPath();
        try
        {
            streamer = new ClipStreamer(pfad);
            streamer.start();
        }
        catch(Exception e)
        {

        }
    }
    
    public void stop()
    {
        streamer.stop();
    }
    
    public void pause()
    {
        streamer.pause();
    }
    
    public void resume()
    {
        streamer.resume();
    }
    
    public long getLength()
    {
        return streamer.getLength();
    }
    
    public void volume(double pVolume)
    {
        streamer.volume(pVolume);
    }

    public void setTracknummer(int pNummer)
    {
        tracknummer = pNummer;
    }

    public int getTracknummer()
    {
        return tracknummer;
    }
    
    public void setNeuladen(boolean pLaden)
    {
        neuladen = pLaden;
    }

    public boolean getNeuladen()
    {
        return neuladen;
    }
    
    public void setPosition(long pMicroseconds)
    {
        streamer.setPosition(pMicroseconds);
    }
  // Ende Methoden
}
```


----------



## PattXterminator (2. Feb 2010)

Ah super OliverKroll, funktioniert wirklich ^^ Dankeschön, hast echt geholfen.

MfG,
PattXterminator


----------

