Files and Folder in Dart
Tags: dart, german
Published: 2021-05-02 12:56:58

In einem [älteren](https://fluttercode.blogspot.com/2021/04/dart-dateioperationen-part-1.html) Post hatte ich mich bereits mit dem Thema, wie man ein File öffnet und den Inhalt liest beschäftigt. In diesem Post befassen wir uns eingehender mit dem Thema.
Wenn Sie ein Programm schreiben, das File Operationen vornimmt, wissen Sie in der Regel, wohin und in welches File Sie die Daten schreiben.
Wenn Ihr Programm aber vom Benutzer Speicherorte entgegen nimmt, wird es wichtig, mit ihnen umzugehen. Starten wir mit folgendem Code:
```dart
import 'dart:io';

import 'package:dart4/dart4.dart' as dart4;

Directory meinDir;
List<FileSystemEntity> files;
FileSystemEntity file;
FileStat f1;

void main(List<String> arguments) {
  meinDir = Directory('E:\\Test'); // 1
  files = meinDir.listSync(recursive: true); // 2
  for (file in files) {
    print(file.absolute); // 3
    f1 = file.statSync(); // 4
    print(f1.toString()); // 5
  }
}
```
Beschreibung: Für File Operationen müssen Sie die **dart:io** Bibliothek in Ihren Code einbinden. Anschliessend werden die Variablen definiert, die das Programm benötigt. 

**Die erste Variable** die definiert wird ist vom Typ Directory.
Wichtig ist hier auch die Hierarchie zu verstehen. **FileSystemEntity** ist die übergeordnete Klasse von **File**, **Directory** und **Link**.

**Die zweite Variable** die Sie benötigen ist vom Typ FileSystemEntity. Objekte von diesem Typ werden zurückgegeben, wenn Sie ein Verzeichnis auslesen. Da das Rückgabeobjekt eine Liste ist, definieren Sie die zweite Variable dementsprechend.

**Die dritte Variable** ist ebenfalls ein **FileSystemEntity** Objekt und wird in der for Schleife benötigt.

**Die letzte Variable** ist vom Typ **FileStat**. Diese Variable enthält im Code die detaillierten Informationen zu Ordnern und Files.

**1.** Im ersten Schritt erstellen Sie ein Directory Objekt, mit einem absoluten oder relativen Pfad zum Verzeichnis.
**2.** Anschliessend wird die **.listSync(..)** Methode verwendet um den Inhalt des Directorys auszulesen. Mit **recursive:true** geben legen Sie fest, das auch untergeordnete Files ausgelesen werden.
**3.**Innerhalb einer **for(..){...}** Schleife werden detaillierte Informationen in das Terminal gedruckt. Die Eigenschaft **file.absolute** enthält dabei den absoluten Pfad zum Verzeichnis oder File.
**4.**Der Code **.statSync(..)** wiederum ruft eine plattformabhängige Funktion auf, die Informationen, wie letztes Aenderungsdatum etc. zurück gibt. Diese Methode gibt ein **FileStat** Objekt zurück.
**5.** Dementsprechend wird dieses **FileStat Objekt** innerhalb der print(..) Funktion in eine Zeichenkette gewandelt.

Nun können Sie aber auch prüfen, ob ein Pfad tatsächlich auf ein Directory verweist. Beispiel:
```dart
 FileSystemEntity.isDirectory(pfad)
      .then((value) => print('Es ist ein Verzeichnis'));
  FileSystemEntity.isFile(pfad2).then((value) => print('Es ist ein File'));
```
Im Code oben sehen Sie dazu zwei Varianten. Die erste überprüft, ob pfad auf ein Verzeichnis verweist, die zweite ob auf ein File.

Zum Abschluss können Sie den Code noch so abändern, das nur das Verzeichnis in das Terminal gedruckt wird:
```dart
if (meinDir.existsSync()) {
    files = meinDir.listSync(recursive: true);
    for (file in files) {
      if (file is Directory) {
        print(file.absolute);
        f1 = file.statSync();
        print(f1.toString());
      }
    }
  }
```
Neu im Code ist eine **if** Abfrage zu Beginn, in welcher geprüft wird, ob das Objekt, auf welches der Pfad verweist, existiert. files ist ja eine Liste aller Verzeichnisse und Dateien die unter dem Zielpfad gespeichert sind. Mit **if(file is Directory){...}** wird geprüft, ob so ein Listeneintrag ein Verzeichnis ist. Zum Abschluss dieses Posts noch einmal der komplette Code:
```dart
import 'dart:io';

import 'package:dart4/dart4.dart' as dart4;

Directory meinDir;
List<FileSystemEntity> files;
FileSystemEntity file;
FileStat f1;
String pfad = 'E:\\Test';
String pfad2 = 'E:\\Test\DartTest\zwecktest.txt';

void main(List<String> arguments) {
  meinDir = Directory(pfad);

  FileSystemEntity.isDirectory(pfad)
      .then((value) => print('Es ist ein Verzeichnis'));
  FileSystemEntity.isFile(pfad2).then((value) => print('Es ist ein File'));

  if (meinDir.existsSync()) {
    files = meinDir.listSync(recursive: true);
    for (file in files) {
      if (file is Directory) {
        print(file.absolute);
        f1 = file.statSync();
        print(f1.toString());
      }
    }
  }
}
```