# Dateien in einem Verzeichnis zählen



## miketronik (21. Feb 2005)

Hallo zusammen,

ich bin neu hier und und versuche mich seit 2 Wochen in Java. Ich kann Controller in Assembler programmieren aber mit Hochsprachen habe ich so meine Probleme.

Ich muß eine Anzahl Dateien in einem Verzeichnis Zählen um sie dann entsprechend zu verteilen. Es gibt ja die Klasse File mit der methode List, die kann man auch mit einem Filter versehen. Soweit die Theorie, aber die praxis hapert und dann die Frage gibt es sowas wie count oder so, kenne ich noch von Clipper. Also ich muss wissen wie viele TIF Dateien in einem Verzeichnis sind. Einen Verzeichniswähler habe ich schonmal ausprobiert. Da ist dann gleich die nächste Frage, kann ich dem Filechooser auch eine Startverzeichnis vorgeben?

Hier mein bisheriges Programm

Danke Mike


```
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.filechooser.*;

public class Faxverteiler extends JFrame implements ActionListener

{
 //Dateidialog erzeugen
 JFileChooser fc = new JFileChooser();

 //Knopf mit Grafiken erstellen
 JButton openButton  = new JButton("Verzeichnis öffnen...",
                       new ImageIcon("Open16.gif"));
 //Eingabeaufforderung mit Grafik erzeugen
 JLabel eingabezeile = new JLabel("Verzeichnis...  ",
                       new ImageIcon("triblue.gif"), SwingConstants.LEFT);
 //Eingabetextfeld erzeugen
 JTextField tf = new JTextField(25);
 //Panel zur Namenseingabe hinzufügen
 JPanel panel = new JPanel();        //panel ist ContentPane
 
 public File tmpfile = new File("");
 
  public Faxverteiler()
  {
   super("Fax - Verteiler");
   setDefaultCloseOperation(EXIT_ON_CLOSE);
   
   fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
   panel.add(eingabezeile);
   tf.setToolTipText("aktuelles Verzeichnis");
   tf.setText(tmpfile.getAbsolutePath());
   panel.add(tf);
   panel.add(openButton);
   openButton.addActionListener(this);
   //panel.setBorder(BorderFactory.createEtchedBorder());
   //getContentPane().add(panel, BorderLayout.NORTH);
   setContentPane(panel);
   
  }

  public void actionPerformed(ActionEvent ae)
  {
   //Handle open button action.

            int returnVal = fc.showOpenDialog(Faxverteiler.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                tf.setText(file.getAbsolutePath());
                
                
                
            } else {
                tf.setText("öffnen abgebrochen.");
            }
  }

   public static void main(String[] args)
  {

   Faxverteiler rahmen = new Faxverteiler();
   rahmen.setLocation(200, 300);
   rahmen.setSize(600,300);
   //rahmen.pack();
   rahmen.setVisible(true);
  }
}
[\code]
```


----------



## Beni (21. Feb 2005)

Anzahl Dateien: lass dir alle Dateien aufliesten, welche es gibt, und zähle sie dann:

```
File directory = ... // Das Verzeichnis, das betrachtet wird
String[] list = directory.list( deinFilter ); // nur gewissen Dateien
int count = list.length; // Die Anzahl gefundener Dateien ist nun in count
```

Das mit dem JFileChooser: setCurrentDirectory


----------



## thE_29 (21. Feb 2005)

Nur sind bei list.length auch die Ordner dabei!


----------



## Illuvatar (21. Feb 2005)

Dann muss bei "deinFilter" eben das berücksichtigt werden.


----------



## Beni (21. Feb 2005)

Guter Einwand, das muss aber nicht sein: man kann "File.listFiles" verwenden, und dieser Methode einen "FileFilter" übergeben (FileFilter != FilenameFilter). Ein FileFilter kann aber Verzeichnisse erkennen, und rauswerfen.


----------



## thE_29 (21. Feb 2005)

Oder du machst halt schnell ne for Schleife


```
File file[] = ...listFiles();
int cnt = 0;
for(int x = 0; x != file.length; x++)
 if(!file[x].isDirectory())
  cnt++;
```


----------



## stev.glasow (21. Feb 2005)

thE_29 hat gesagt.:
			
		

> Oder du machst halt schnell ne for Schleife
> 
> 
> ```
> ...



Mit nem Filter geht's schneller  8)  :bae:


----------



## thE_29 (21. Feb 2005)

Jo, is klar, aber wer den Filter noch net kann und ne for Schleife schon ist mit dem auch bedient


----------



## stev.glasow (21. Feb 2005)

Stimmt, *nachgeb*


----------



## Miketronik (21. Feb 2005)

Ich habe mit der ganzen Mnemonik noch meine Probleme, z.B. habe ich jetzt mal sowas gemacht:

fc.setCurrentDirectory("c:\\");

da gibts gleich ne Fehlermeldung:
Faxverteiler.java:33: setCurrentDirectory(java.io.File) in javax.swing.JFileChooser cannot be applied to (java.lang.String)
   fc.setCurrentDirectory("c:\\");


ich habe überhaupt Probleme mit der ganzen schreibweise:

in C habe ich früher immer so getestet, meinet wegen:

string alf;

alf=getCurrentDirectory();

printf(alf);

da weiste erstmal was zurück kommt, aber sowas bekomme ich in Java nich hin. Da gibt immer irgendeine Fehlermeldung. Bin eben ein Anfänger.


----------



## Stefan1200 (21. Feb 2005)

Naja, das aktuelle Verzeichnis ist doch identisch mit ".", das sollte sowohl unter C als auch unter Java gehen.


----------



## Beni (21. Feb 2005)

Wenn Du dem Link folgst, den ich oben gepostet habe, siehst du, dass setCurrendDirectory ein File erwartet, keinen String.

Also:

```
File directory = new File( "c:/" );
jFileChooser.setCurrendDirectory( directory );
```


----------



## thE_29 (21. Feb 2005)

Wie wärs mit 


```
fc.setCurrentDirectory(new File("C:\\"));
```

Nachtrag: mist langsamer, elendiges ICQ lenkt nur ab


----------



## miketronik (21. Feb 2005)

Hallo,

habe ich gelesen und was liefert dann getCurrentDirectory() zurück? Wo bekomme ich dann raus was File ist und wie ich das dargestellt bekomme?

Danke Mike


----------



## meez (21. Feb 2005)

ich würds auch mit nem Filter machen:

Filterklasse (Kannst dir ja ne Bibliothek mit solch generischen Klassen anlegen)

```
public class FilterFiles implements FileFilter {
  public boolean accept(File file) {
     return !file.isDirectory();
  }
}
```
Aufruf dann so:

```
int anzfiles = new File("<pfad zum directory>").listFiles(new FilterFiles ()).length();
```


----------



## miketronik (24. Feb 2005)

Hallo alle zusammen,

mir ist es jetz soweit klar wie man auf ein Verzeichnis zugreift und die Anzahl der Dateien feststellt. Aber ein Beispiel FileFilter währe ganz gut. So das man am Ende selektieren kann, z.B. *.gif.


----------



## Illuvatar (24. Feb 2005)

Meez hat doch schon einen geschrieben, den könnte man halt jetzt noch um eine Endung erweitern:

```
public class FilterFiles implements FileFilter { 
  public boolean accept(File file) { 
     return !file.isDirectory() && file.getName().endsWith (".gif"); 
  } 
}
```


----------



## miketronik (25. Feb 2005)

Ja ist mir klar aber ich habe eben weiter ein Problem, hier mal mein Codeschnipsel, es kommt false raus bei der Ausgabe in Zeile 35. Warum.

Danke Mike



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

public class TestFile
{
  public static void main(String[] args)
  {
    File tmpfile = new File("d:\\java\\quellen\\Testfile\\");
    TestFile.printFileInfo(tmpfile);
  }
  static void printFileInfo(File tmpfile)
  {
   System.out.println("Name            = " + tmpfile.getName());
   System.out.println("Path            = " + tmpfile.getPath());
   System.out.println("Absoluter Pfad  = " + tmpfile.getAbsolutePath());
   System.out.println("Parent          = " + tmpfile.getParent());
   System.out.println("exists          = " + tmpfile.exists());
   System.out.println("canWrite        = " + tmpfile.canWrite());
   System.out.println("canRead         = " + tmpfile.canRead());
   System.out.println("isFile          = " + tmpfile.isFile());
   System.out.println("isDirectory     = " + tmpfile.isDirectory() + "\n");
   if (tmpfile.isDirectory()) {
     String[] fils = tmpfile.list();     //hier wird ein Array angelegt das so
                                         //tief ist wie die Anzahl Elemente in
                                         //tmpfile mit list() festgestellt

     System.out.println("Anzahl Einträge = " + fils.length);
                                         //hier wird die Tiefe des Arrays mit
                                         //length gelesen und ausgegeben



     //Hier ist mein Problem!!!! wiso false ???
     System.out.println(tmpfile.getName().endsWith(".class"));
                                         
     for (int i=0; i<fils.length; ++i) {
       System.out.println("  "+fils[i]);
     }

   }

  }

}
```


----------



## Illuvatar (25. Feb 2005)

Höh? Weil der Name eben net auf class endet. Wieswo sollte er auch ???:L SSchau mal was du da übergibst in der main, das hat mit class nix zum tun.


----------



## miketronik (25. Feb 2005)

Illuvatar hat gesagt.:
			
		

> Höh? Weil der Name eben net auf class endet. Wieswo sollte er auch ???:L SSchau mal was du da übergibst in der main, das hat mit class nix zum tun.



In der Main übergebe ich das Verzeichnis wo mein Testprogramm steht das heist Testfile und da dazu gibts eine TestFile.class und irgendeine Backup.class das sind dann 2. Ich brauche am Ende die Anzahl Files mit der oder der Endung im Verzeichnis, zum Test eben mal class.

Mike


----------



## Illuvatar (25. Feb 2005)

Vielleicht willst du die Ausgabe in der for-Schleife machen, und zwar net von zmpfile sondern dann von fils_?_


----------



## miketronik (25. Feb 2005)

Illuvatar hat gesagt.:
			
		

> Vielleicht willst du die Ausgabe in der for-Schleife machen, und zwar net von zmpfile sondern dann von fils_?_


_

Ja so geht es, es ist aber dann eine Schleife wie oben geschrieben und hat wenig mit nem Filter zu tun. Kann es sein, das FileFilter nur auf Filecooser anzuwenden ist? Ich habe das mit der Vererbung sowiso noch nicht richtig verstanden.



		Code:In die Zwischenablage kopieren


public class TestFile
{
  public static void main(String[] args)
  {

    File tmpfile = new File("d:\\java\\quellen\\Testfile\\");
    TestFile.printFileInfo(tmpfile);
  }
  static void printFileInfo(File tmpfile)
  {
   System.out.println("Name            = " + tmpfile.getName());
   System.out.println("Path            = " + tmpfile.getPath());
   System.out.println("Absoluter Pfad  = " + tmpfile.getAbsolutePath());
   System.out.println("Parent          = " + tmpfile.getParent());
   System.out.println("exists          = " + tmpfile.exists());
   System.out.println("canWrite        = " + tmpfile.canWrite());
   System.out.println("canRead         = " + tmpfile.canRead());
   System.out.println("isFile          = " + tmpfile.isFile());
   System.out.println("isDirectory     = " + tmpfile.isDirectory() + "\n");
   if (tmpfile.isDirectory()) {
     String[] fils = tmpfile.list();     //hier wird ein Array angelegt das so
                                         //tief ist wie die Anzahl Elemente in
                                         //tmpfile mit list() festgestellt

     System.out.println("Anzahl Einträge = " + fils.length);
                                         //hier wird die Tiefe des Arrays mit
                                         //length gelesen und ausgegeben
                                         
     int j=0;
     for (int i=0; i<fils.length; ++i) {
       if (fils[i].toLowerCase().endsWith(".class")) {
         ++j;
       }
     }
     System.out.println("Anzahl *.class = " + j);

   }

  }

}

_


----------

