DEV Community

flutterCode
flutterCode

Posted on

Files and Folder in Dart

In einem älteren 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:

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
  }
}
Enter fullscreen mode Exit fullscreen mode

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:

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

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:

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());
      }
    }
  }
Enter fullscreen mode Exit fullscreen mode

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:

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());
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)