Hi allerseits! Habe eine kleine Frage. Ich würde gerne alle Dateien und (ggf. leeren) Ordner und Unterordner auslesen, die sich im Ordner “C:\Test” befinden. Das Auslesen und die Ausgabe auf der Konsole klappt soweit mit folgendem Code:
import java.io.IOException;
import java.nio.file.Files;
public class Dateianzeige {
static File ordner = new File("C:/Test");
public static void main(String[] args) {
Ordnerscan();
}
public static void Ordnerscan() {
try {
// gibt alle Dateien und Ordner aus, die im Ordner liegen
Files.walk(ordner.toPath())
.forEach(System.out::println);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}```
Nun würde ich aber die Pfade zu den Dateien und Ordnern nicht (nur) auf der Konsole ausgeben, sondern in ein Array speichern. Gibt es eine Möglichkeit, mit der ich den Punk mit dem ".forEach" so ändern kann, dass die Werte in ein Array gespeichert werden?
Da ich unter Java absoluter Anfänger bin, bin ich auch für alle Arten von sonstigen Tipps und Hinweise auf sonstige Fehler im Code immer dankbar.
Da die Ziele nicht klar sind, könnte man da tausende Dinge dazu sagen.
Aber in bezug auf den konkreten Punkt: Mit List<Path> list = Files.walk(ordner.toPath()).collect(Collectors.toList());
kann man sich die Paths als Liste sammeln lassen. Arrays sind etwas sperrig (man weiß ja z.B. am Anfang nicht mal, wie groß der Array sein müßte!). Üblicherweise verwendet man Collections wie z.B. List. (Und Arrays nur, wenn dafür ein driftiger Grund besteht).
FALLS ein driftiger Grund besteht, könnte man aus obiger Liste mit Path[] array = list.toArray(new Path[0]);
einen Array erstellen, aber … welcher Grund das sein soll, würde mich dann mal interessieren
Für den Fall, dass es wirklich ein Array sein sollte würde ich aber eher Files.walk(ordner.toPath()).toArray(Path[]::new); nehmen. Spart einfach den Umweg über die Liste
Danke für eure Antworten! Da ich blutiger Java-Anfänger bin, bin ich auch für jeden Tipp dankbar, der über meine eigentliche Frage hinausgeht.
Den obigen Code brauche ich für folgendes Vorhaben: ich möchte mit dem Programm alle Dateien und (Unter)-Ordner, die in einem bestimmten Verzeichnis liegen in eine ZIP-Datei packen. Dafür findet man im Netz natürlich eine Vielzahl von fertigen Beispielen. Alle Beispiele, die ich gefunden habe, haben aber einen kleinen Haken. Sie zippen zwar alle Dateien und das auch in der bestehenden Ordnerstruktur, allerdings werden leere Ordner nicht mit eingezippt. Daher wollte in meinem Programm zuerst alle Dateien (also auch leere Ordner) erfasse und diese dann zippe (indem beim schreiben in die ZIP-Datei bei den leeren Ordnern hinten ein “/” angehängt wird).
[ot]
Je nachdem, worum es da geht: Ich habe mir mal „ein eigenes Backup-Programm“ ( ) geschrieben. Das besteht aus zwei BAT-Dateien
zipSingle.bat:
jar -cMf "%~1.zip" %1
ren %1 "_ZIPPED_%~1"
zipAll.bat:
for /D %%i in (*.) do %0\..\zipSingle "%%i"
„jar.exe“ ist das JAR-Erstell-Tool von Java (liegt im „Java/JDK/bin/“-Ordner). Eine JAR-Datei ist einfach nur eine ZIP-Datei. Die angegebenen Parameter (-cMf) besagen u.a. dass keine Manifest-Datei erstellt werden soll und so, sondern nur eine „reine ZIP“.
Man kann also mit
zipSingle MeinVerzeichnis
eine „MeinVerzeichnis.zip“ erstellen, die „MeinVerzeichnis“ enthält.
(Mit der ren-Zeile wird das Verzeichnis dann umbenannt, um deutlich zu machen, dass es gezippt wurde und ggf. gelöscht werden kann - die Zeile kann man auch weglassen, wenn man das nicht will)
Mit zipAll
läuft er über alle Unterverzeichnisse des aktuellen Verzeichnisses, und ruft für jedes zipSingle auf.
Damit kann man schnell ein Backup von einem ganzen Ordner erstellen. Und … leere Dateien und Ordner sind da natürlich auch dabei