Verzeichnis ausgeben mit Unterverzeichnissen und einzelnen Dateien

masul

Mitglied
Hallo Leute!
Wir haben als Übung im Studiengang Medieninformatik, 2. Semester, die Aufgabe bekommen, anhand eines angegebenen Pfades alle Verzeichnisse und Unterverzeichnisse auszugeben und auch einzelne Dateien anzeigen zu lassen.
Hab schon ein Programm geschrieben, nur leider macht es nicht immer das, was es machen soll und liefert zudem nicht immer die korrekte Anzahl an Dateien.

Komme einfach nicht weiter!

Es ist wirklich dringend!!!

Danke euch im Voraus!
Java:
public static void printAll(File path) {
       PrintWriter out = new PrintWriter(System.out,true);
       File[] fileArray = path.listFiles();
       if (fileArray != null) {
	for (int i = 0; i < fileArray.length; i++) {
	       if (fileArray[i].isDirectory()) {
		if (fileArray.length<10) {
		    out.println("Verzeichnis"+ fileArray[i].getAbsolutePath() + "[mit 0" + fileArray.length + " Dateien]");
		} else {
		    out.println("Verzeichnis "+ fileArray[i].getAbsolutePath() + "[mit " + fileArray.length  + " Dateien]");
					 }
	       printAll(fileArray[i]);
                  } else { 
		    out.println("Datei " + fileArray[i].getName());
	       }
	 }
       }
       out.close(); 
}
 

HimBromBeere

Top Contributor
Gibt´s dazu ´ne konkrete Frage? In welcher Zeile hängt´s denn, gibt es Fehlermeldungen, was soll denn passieren und was passiert stattdessen? Fragen über Fragen...

EDIT: Wohin gehört das
Code:
else
in Zeile 13?
 
Zuletzt bearbeitet:

Jodo

Aktives Mitglied
Wie HimBromBeere schon sagt, können wir deine Fehler nicht erraten ;).

-Edit-
Schwachsinn von mir entfernt :oops:

Aber wieso unterscheidest du bei den Verzeichnislängen?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
für Unterverzeichnisse bietet sich Rekursion an:
wenn du nicht nur die Ausgabe 'mit x Dateien' haben willst, sondern diese Datein + evtl. weitere Unterverzeichnisse auch,
dann wieder printAll() für diese Unterverzeichnis aufrufen

-----
nur wegen Einfügen einer 0 bei < 10 den ganzen out-Befehl zu wiederholen ist unschön,
lege dir lieber eine Variable an:
String fLength = ... mit if/else oder ternären Operator und diesen String dann im langen nur einmal programmieren out-Befehl
 

masul

Mitglied
Also er gibt mir z.B. sowas aus:

Verzeichnis C:\Users\acer\Desktop\Gregor Staub - MegaMemory[mit 05 Dateien]
Verzeichnis C:\Users\acer\Desktop\Gregor Staub - MegaMemory\Gregor Staub - Mega Memory - Selbstlehrgang für Gedächtnistraining[mit 02 Dateien]
Verzeichnis C:\Users\acer\Desktop\Gregor Staub - MegaMemory\Gregor Staub - Mega Memory - Selbstlehrgang für Gedächtnistraining\CD1[mit 12 Dateien]
Datei artist - Track 1.mp3
Datei artist - Track 2.mp3


Diese Ausgabe beinhaltet aber leider nicht alle vorhandenen Verzeichnisse.

Die Aufgabenstellung für diese Methode:
/** Gibt alle Verzeichnisse und Dateien in dem Verzeichnis, das durch den Parameterwert path beschrieben wird, in der untenstehenden Form aus. Es werden durch Rekursion auch alle Unterverzeichnisse und deren Inhalt mit ausgegeben.*/

Form der Ausgabe:
Verzeichnis Z:/java/project/PR2/src
Verzeichnis Z:/java/project/PR2/src/a03 [mit 02 Dateien]
Datei Aufgabe2.java
Datei Aufgabe2ersterversuch.java [mit 02 Dateien]

usw.




Fehlermeldungen gibt es keine. Das Programm gibt bei mir die oben angeführte Ausgabe aus, aber darin fehlen viele Ordner und Dateien.



Java:
public static void main(String[] args) {
		DirContent test = new DirContent();
		test.printAll("C:\\Users\\acer\\Desktop");
}
Das ist übrigens meine main-Methode..
 

Jodo

Aktives Mitglied
Ich habs grade mal bei mir getestet. Wenn ich anstatt deinem
Code:
PrintWriter
das normale
Code:
System.out.println()
benutze, funktioniert es bei mir. Suche grad noch wo der Writer vorher geschlossen wird/werden könnte.

-Edit-
Wo auch noch ein Denkfehler drin stecken müsste: Du prüfst ob eine File im Array ein Verzeichnis ist und gibst aber immer die Anzahl an Dateien aus die im aktuellen Verzeichnis liegen, nicht in dem "gefundenen".
 
Zuletzt bearbeitet:

Jodo

Aktives Mitglied
Vermutlich in Zeile 18 wo der close() Befehl steht ;) Wenn er beim ersten Verzeichnis ganz unten in der Rekursion angekommen ist wird der Stream geschlossen.

Ja, habs etwas falsch formuliert, merk ich auch grad :eek:
Versteh nur grad selbst nicht, wieso das Problem auftritt. Er geht ja mit ner Tiefensuche vor und in jedem Rekursionsschritt wird ein neuer PrintWriter-Objekt erzeugt. Ergo bleibt der Äußerste ja offen solange er die Dateien/Verzeichnisse im obersten Verzeichnis durchgeht.

-Edit-
Ok. Problem (wohl) gefunden. Da dem PrintWriter der
Code:
System.out
übergeben wird, wird dieser mitgeschlossen? Jedenfalls ist
Code:
System.out
danach nichtmehr benutzbar.
 
Zuletzt bearbeitet:

irgendjemand

Top Contributor
@TO
die formatierung ist ja nicht gerade die beste
dann noch : warum PrintWriter über System.out und den auch noch closen ? du kannst dierekt System.out.println() callen ... denn System.out ist vom typ PrintStream
auch hast du einen logikfehler drin : die ausgabe der anzahl ist die im aktuellen verzeichnis ... aber nicht die dessen was du gerade ausgegeben hast ... dafür müsstest du dann sowas nach der art schreiben : [c]fileArray.listFiles().length[/c] ... was aber eigentlich einen rekursionsschritt tiefer stehen sollte ...

alles in allem zwar schon mal ein guter ansatz ... aber mit ner menge logik-fehler
 
G

Gas3t

Gast
Ich bin im Gleichen Kurs wie "masul" und habe meine Klasse sehr ähnlich geschrieben.
Auch die geschilderten Probleme sind bei mir gleich; wobei ich aber z.B. das mit dem Printwriter behoben habe (einfach System.out.println geschrieben...).

Ein anderes Problem, welches mir aufgefallen ist, dass das erste Unterverzeichnis von "path" bei mir nicht ausgegeben wird, sondern lediglich die Dateien.
Kann dies mit der Rekursion zusammenhängen ?
 

Jodo

Aktives Mitglied
Ein anderes Problem, welches mir aufgefallen ist, dass das erste Unterverzeichnis von "path" bei mir nicht ausgegeben wird, sondern lediglich die Dateien.
Kann dies mit der Rekursion zusammenhängen ?

Das Startverzeichnis, oder wirklich das erst Unterverzeichnis? Ist das Verzeichnis zufällig lexikographisch der erste Eintrag im System, und dadurch auch im Array, und du hast ne falsche Schleifenvariable?

Zeig mal etwas Code, dann kann man dir auch helfen.
 
G

Gas3t

Gast
Ich glaube du hast Recht. Das ist das Startverzeichnis - im meinem Fall "prtest" (s. Code) - welches wohl übersprungen wird.
Der Rest scheint jetzt aber ganz gut zu laufen.

Java:
public class DirContent{
	
	public static void main(String[] args){
		printAll("C:\\Users\\Nessi\\Desktop\\prtest");
	}
	
	/** Hilfsmethode String-Objekt --> File-Objekt */	
	public static void printAll(String path){
		printAll(new File(path));
	}
	
	/**
	 * Gibt alle Verzeichnisse und Dateien in dem Verzeichnis aus.
	 * Durch Rekursion werden auch alle Unterverzeichnisse und deren Dateien ausgegeben.
	 * @param path steht stellvertretend für den Verezeichnispfad, wird von <code> main </code> übergeben.
	 */
	public static void printAll(File path){
		File [] fileList = path.listFiles();
		if (fileList != null){
			for (int i =0; i<fileList.length; i++){
				if (fileList[i].isDirectory()){
					int length = fileList[i].listFiles().length;
					if (length<10){
						System.out.println("Verzeichnis "+ fileList[i].getAbsolutePath() + " [mit 0" + length + " Dateien]");
					}
					else{
						System.out.println("Verzeichnis "+ fileList[i].getAbsolutePath() + " [mit " + length + " Dateien]");
					}
					printAll(fileList[i]);		
				}
				else{
					System.out.println("Datei \t\t" + fileList[i].getName());
				}	
			}
		}
	}
 

Jodo

Aktives Mitglied
Bei Rekursion musst du beachten, dass die Methode auf jeder Rekursionsebene exakt das selbe tun sollte mit der selben Art von Daten. Was du machst ist, du nimmst alle Unterdateien des aktuellen Verzeichnisses und prüfst dessen Inhalt. Du kümmerst dich aber gar nicht drum, dass beim ersten Aufruf das Startverzeichnis ja auch scho gelistet werden sollte.

Lösung deines Problems ist, wie schon gesagt, das selbe Verhalten für jede Ebene, sprich:
  1. Du prüfst ob das aktuelle File-Objekt ein Verzeichnis ist, wenn ja gibs aus.
  2. Für alle anderen File's prüfen ob sie eine Datei oder ein Verzeichnis sind und gegebenenfalls rekursiv absteigen.(was du ja schon richtig machst).
 
G

Gas3t

Gast
Du prüfst ob das aktuelle File-Objekt ein Verzeichnis ist, wenn ja gibs aus.

Das mache ich doch in Zeile 21. Und die Rekursion ist ja in Zeile 29.
Ich bin, glaube ich, etwas überfordert... :-/

Des weiteren sehe ich gerade, dass er bei der Anzahl der Dateien "alles", d.h. auch die Verzeichnisse, mitrechnet. Hier müsste ich bei dem length()-Ausdruck etwas ändern, oder ?

Vielen Dank für die ganzen hilfreichen Antworten ! :)
 

Jodo

Aktives Mitglied
Das mache ich doch in Zeile 21. Und die Rekursion ist ja in Zeile 29.
Ich bin, glaube ich, etwas überfordert... :-/
Ganz cool bleiben ;) Überleg dir immer Schritt für Schritt was du machen musst (auch mal ohne Java Code) und das setzt du dann meist 1:1 in Java um. Du machst bei dir nicht ganz exakt, das was du tun solltest. Da du ja das Startverzeichnis mit drin haben willst, ist das erste was du machen musst: Prüfen ob das aktuelle File (path bei dir) ein Verzeichnis ist und dann ausgeben.
Also sowas in der Art

Java:
public static void printAll(File path) {
    File[] fileArray;

    if (path.isDirectory) {
        //Verzeichnis Ausgabe und alle Dateien im Verzeichnis holen
    }

    if (fileArray != null) {
        //hier dein bisheriger Code, nur dass du hier nichtmehr die Verzeichnisse ausgibst
        //sondern nur den rekursiven Aufruf tätigst, falls es ein Verzeichnis ist.
    }
}

[EDIT]Ob in die Anzahl der Dateien auch die Verzeichnisse mit eingerechnet werden sollen ist Auslegungsache bzw. abhängig von der Aufgabenstellung. Ich würd's dazu machen, wenn in der Aufgabe nichts anderes steht.[/EDIT]
 
Zuletzt bearbeitet:

irgendjemand

Top Contributor
ich hatte mal langeweile und hab euch mal auf die schnelle was zusammengebastelt

Java:
import java.io.File;
import java.io.IOException;
public class RecursiveFileLister
{
	public static void main(String[] args) throws IOException
	{
		if(args.length!=1)
		{
			System.err.println("USAGE : java RecursiveFileLister <PATH>");
			System.exit(1);
		}
		File path=new File(args[0]);
		(new RecursiveFileLister()).list(path);
	}
	private RecursiveFileLister() { }
	private void list(File path) throws IOException
	{
		path=path.getCanonicalFile();
		if(path.isFile())
		{
			System.out.println("Datei : "+path.getAbsolutePath());
			return;
		}
		if(path.isDirectory())
		{
			int subdirs=0;
			int files=0;
			File[] subfiles=path.listFiles();
			if(subfiles==null||subfiles.length==0)
			{
				System.out.println("Ordner : "+path.getAbsolutePath()+ " (0 Ordner, 0 Dateien)");
				return;
			}
			for(int i=0; i<subfiles.length; i++)
			{
				if(subfiles[i].isFile())
				{
					files++;
				}
				if(subfiles[i].isDirectory())
				{
					subdirs++;
				}
			}
			System.out.println("Ordner : "+path.getAbsolutePath()+" ("+subdirs+" Ordner, "+files+" Datei"+((files==1)?")":"en)"));
			for(File subfile : subfiles)
			{
				list(subfile);
			}
			return;
		}
		System.err.println("UKNOWN TYPE");
	}
}

ich gebe euch den tipp in eurem eigenen interesse diesen code NICHT 1-zu-1 zu kopieren ... weil ein solcher programmierstil dürfte eurem dozenten auffallen *foreach , ternary operator , OOP*

es soll euch aber den leitgedanken geben

ich hab mal quick'n'dirty die IOException von File.getCanonicalFile() einfach weitergeworfen

*zeile 18 ist wichtig um einen ausgabe-bug zu verhindern wenn ein komplettes laufwerk oder ein relativer pfad angegeben wurde
zeile 29 : prüfung auf NULL wichtig da dies z.b. auftreten kann wenn auf ein verzeichnis keine zugriffsrechte vorhanden sind
*zeile 52 : falls ein eintrag gefunden wird der WEDER File NOCH Directory ist *unter unix z.b. sockets oder anderer kram unter z.b. /dev/*
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
kaoZ Input/Output Verzeichnis Inhalt in combobox ausgeben Java Basics - Anfänger-Themen 8
G Verzeichnis von *.class ausgeben lassen Java Basics - Anfänger-Themen 3
G Dateinamen aus einem Verzeichnis ausgeben Java Basics - Anfänger-Themen 3
P Standard resources-Verzeichnis ändern Java Basics - Anfänger-Themen 9
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
S Verzeichnis Lese-Berechtigung entziehen Java Basics - Anfänger-Themen 1
B Name von Verzeichnis bekommen - Files von einem Ordner auslesen Java Basics - Anfänger-Themen 4
S Image Datei selektieren und in Projekt Verzeichnis abspeichern/kopieren Java Basics - Anfänger-Themen 16
F Verzeichnis synchronisieren Java Basics - Anfänger-Themen 3
R Input/Output Dateinamen aus Verzeichnis in Datei schreiben Java Basics - Anfänger-Themen 3
M java.io.FileNotFoundException trotz dass Verzeichnis korrekt angegeben ist! Java Basics - Anfänger-Themen 20
M Erste Schritte Ordner im selber Verzeichnis wählen Java Basics - Anfänger-Themen 1
J Lokales Verzeichnis -> Globales Verzeichnis Java Basics - Anfänger-Themen 10
D Input/Output Ordner aus .Jar in das Verzeichnis der .Jar kopieren Java Basics - Anfänger-Themen 1
B Dateien aus dem "resource" - Folder kopieren in Verzeichnis Java Basics - Anfänger-Themen 9
B "Vor" Verzeichnis bekommen Java Basics - Anfänger-Themen 1
I Automatisch Verzeichnis erstellen bei File erstellen Java Basics - Anfänger-Themen 5
A Datei im erstelltem Verzeichnis erstellen? Java Basics - Anfänger-Themen 1
Z Gleiches Verzeichnis für class und java unter Windows Muss? Java Basics - Anfänger-Themen 11
Traxx JDK installieren .java nur im Java\bin Verzeichnis ausführbar Java Basics - Anfänger-Themen 22
S 3 Fragen, Verzeichnis, GridLayout psoitionieren, Werte für JSpinner Java Basics - Anfänger-Themen 2
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
K Bin-Verzeichnis Java Basics - Anfänger-Themen 4
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
S Darüberliegende Verzeichnis ansprechen Java Basics - Anfänger-Themen 3
C Datei in bestimmtes Verzeichnis speichern Java Basics - Anfänger-Themen 2
E Erste Schritte Verzeichnis auslesen, Dateinamen in Array speichern :-( Java Basics - Anfänger-Themen 7
P javac Verzeichnis Java Basics - Anfänger-Themen 2
N Input/Output mit FileDialog Verzeichnis wechseln Java Basics - Anfänger-Themen 20
eLogic Input/Output Liest Verzeichnis nicht aus??? Java Basics - Anfänger-Themen 6
G Bilder aus dem Projekt Verzeichnis werden n. angezeigt Java Basics - Anfänger-Themen 7
B Files aus Verzeichnis zählen Java Basics - Anfänger-Themen 9
M Verzeichnis öffnen? Java Basics - Anfänger-Themen 5
dognose Verzeichnis rekursiv auslesen / beschränkte Apis. Java Basics - Anfänger-Themen 6
J Verzeichnis auslesen und festgelegte Anzahl Bilder zeichnen Java Basics - Anfänger-Themen 4
G Verzeichnis auslesen mit sehr sehr vielen Bildern Java Basics - Anfänger-Themen 6
M Verzeichnis verschieben Java Basics - Anfänger-Themen 5
H Verzeichnis Java Basics - Anfänger-Themen 9
R Verzeichnis feststellen Java Basics - Anfänger-Themen 14
O Aktuelles Verzeichnis Runtime.getRuntime().exec Java Basics - Anfänger-Themen 6
L Datei kopieren in anders verzeichnis geht nicht Java Basics - Anfänger-Themen 17
G Dateien im Verzeichnis anzeigen lasssen Java Basics - Anfänger-Themen 7
M Systembefehl Verzeichnis öffnen Java Basics - Anfänger-Themen 5
G Verzeichnis herausfinden Java Basics - Anfänger-Themen 3
N Verzeichnis auf genügend Festplattenplatz überprüfen - Linux Java Basics - Anfänger-Themen 15
M Eclipse: mehrere Versionen einer *.class im Verzeichnis Java Basics - Anfänger-Themen 3
G in Verzeichnis auf gleicher Ebene wechseln Java Basics - Anfänger-Themen 4
M Dateien aus Verzeichnis filtern, aber nicht nach Endung Java Basics - Anfänger-Themen 59
A dateiname aus verzeichnis auslesen Java Basics - Anfänger-Themen 2
G Wie finde ich das Verzeichnis von meinen Java Projekt? Java Basics - Anfänger-Themen 7
S String für das java jre home verzeichnis Java Basics - Anfänger-Themen 3
A Gibt es standardmässig in Java einen Verzeichnis-Listener? Java Basics - Anfänger-Themen 6
T Dateien aus einem Verzeichnis in eine Textdatei schreiben Java Basics - Anfänger-Themen 3
E JFileChooser -> Verzeichnis setzen Java Basics - Anfänger-Themen 10
M window verzeichnis öffnen Java Basics - Anfänger-Themen 6
zilti In Java das Verzeichnis wechseln Java Basics - Anfänger-Themen 21
Q Prüfen, ob ein FTP-Verzeichnis vorhanden ist Java Basics - Anfänger-Themen 2
M Importieren einer Javadatei aus einem anderen Verzeichnis Java Basics - Anfänger-Themen 4
G Reflection - Klasse laden aus anderem Verzeichnis Java Basics - Anfänger-Themen 4
G Windows-Verzeichnis ermitteln Java Basics - Anfänger-Themen 7
M Verzeichnis der main Klasse herausfinden Java Basics - Anfänger-Themen 7
M Datei ins aktuelle Verzeichnis speichern Java Basics - Anfänger-Themen 5
loadbrain relatives Verzeichnis angeben Java Basics - Anfänger-Themen 3
P Verzeichnis meines Programms Java Basics - Anfänger-Themen 4
S Verzeichnis auf Existenz prüfen + Inhalt holen Java Basics - Anfänger-Themen 9
F Jar-"Home" Verzeichnis Java Basics - Anfänger-Themen 5
G aktuelles verzeichnis finden Java Basics - Anfänger-Themen 5
M Namen der Dateien in einem bestimmten Verzeichnis erhalten Java Basics - Anfänger-Themen 4
P Wieso wird der komplette Inhalt im verzeichnis nicht gelösch Java Basics - Anfänger-Themen 5
Bierhumpen verzeichnis auslesen? Java Basics - Anfänger-Themen 13
S Verzeichnis darstellen Java Basics - Anfänger-Themen 3
G Auf File / Verzeichnis innerhalb eines jars zugreifen Java Basics - Anfänger-Themen 2
T Dateien/Ordner in einem Verzeichnis zählen Java Basics - Anfänger-Themen 13
G das aktive Verzeichnis abfragen Java Basics - Anfänger-Themen 4
F Home-Verzeichnis des Benutzers ändern Java Basics - Anfänger-Themen 4
E In welches Verzeichnis müssen selbsterstellte Klassen ? Java Basics - Anfänger-Themen 6
L Mit File erzeugtes Verzeichnis ist schreibgeschützt Java Basics - Anfänger-Themen 3
H Verzeichnis lesen, und nur unterverzeichnisse heraus filtern Java Basics - Anfänger-Themen 6
M Paket aus beliebigem Verzeichnis importieren Java Basics - Anfänger-Themen 9
G Verzeichnis kopieren Java Basics - Anfänger-Themen 2
X Verzeichnis Probs mit Klassen Java Basics - Anfänger-Themen 3
S Verzeichnis auslesen! Java Basics - Anfänger-Themen 3
R dateien in einem verzeichnis einlesen Java Basics - Anfänger-Themen 3
T Unter Windows mit Java ein Verzeichnis erstellen? Java Basics - Anfänger-Themen 4
M Filecooser - Verzeichnis ohne "" Laufwerke mit &q Java Basics - Anfänger-Themen 2
S Ein Verzeichnis anpollen Java Basics - Anfänger-Themen 8
M Dateien in einem Verzeichnis zählen Java Basics - Anfänger-Themen 21
B Angabe import-Verzeichnis & Error704:cannot access direc Java Basics - Anfänger-Themen 6
M alle Files aus einem Verzeichnis finden Java Basics - Anfänger-Themen 15
G Verzeichnis auslesen und alle Unterordner/Dateien speichern Java Basics - Anfänger-Themen 9
A Windows tmp-Verzeichnis ermitteln Java Basics - Anfänger-Themen 6
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
Glühlampe Usereingabe in der gleichen Zeile ausgeben Java Basics - Anfänger-Themen 6
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
H Minimum und Maximum ausgeben lassen Java Basics - Anfänger-Themen 7
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben