Для работы с файловой системой и вообще системой ввода/ввода в языке Dart предназначен dart:io, который определяет соответствующий функционал. В частности, для работы с каталогами в этом пакете определен класс Directory
Для создания объекта Directory можно использовать фабричный конструктор класса, в который передается в качестве параметра путь к каталогу:
var myDir = Directory("temp");
Среди свойств класса Directory следует отметить свойство path, которое возвращает путь к каталогу.
import 'dart:io'; void main() { var myDir = Directory("temp"); print(myDir.path); // temp }
В данном случае используется относительный путь - "temp", то есть подразумевается, что каталог temp будет находиться в папке проекта. Также можно передать абсолютный путь:
import 'dart:io'; void main() { var myDir = Directory("D:\hello"); print(myDir.path); // D:\hello }
Кроме того, с помощью статического свойства current можно получить путь к текущей папке, а с помошью статического свойства - каталог для временных файлов в текущей системе (папка Temp в Windows)
import 'dart:io'; void main() { print(Directory.current); print(Directory.systemTemp); }
Для создания каталога применяется метод create()
Future<Directory> create({bool recursive = false})
Например, создадим в текущей папке папку "hello":
import 'dart:io'; void main() { var myDir = Directory("hello"); myDir.create(); print("Folder has been created"); }
Если нам надо создать вложенный каталог, то в метод надо передать параметр recursive
со значением true
:
import 'dart:io'; void main() { var myDir = Directory("hello1/temp"); myDir.create(recursive: true); print("Folder has been created"); }
Здесь создается каталог "hello1/temp", причем каталог hello1 может не существовать.
С помошью метода list() можно получить содержимое папки - вложенные папки и файлы
Stream<FileSystemEntity> list({bool recursive = false, bool followLinks = true})
Каждый отдельный каталог или файл в папке представлен типом FileSystemEntity. Данный метод возвращает поток (объект Stream) из подобных объектов FileSystemEntity. Например, получим все папки и файлы с диска С:
import 'dart:io'; void main() async { var myDir = Directory("C:\\"); try{ await for (var entity in myDir.list()) { print(entity.path); } } catch(ex){ print(ex);} }
Здесь мы перебираем поток данных в цикле for. И поскольку возвращается именно поток Stream, то для перебора перед циклом for указывается оператор await
У объекта FileSystemEntity с помощью свойства path
можно получить полный путь. Например, результат работы в моем случае:
C:\$Recycle.Bin C:\$SysReset C:\$Windows.~WS C:\$WinREAgent C:\dart C:\dart-sdk C:\Documents and Settings C:\DumpStack.log.tmp C:\flutter C:\hiberfil.sys C:\OneDriveTemp C:\pagefile.sys C:\PerfLogs C:\Program Files C:\Program Files (x86) C:\ProgramData C:\Recovery C:\swapfile.sys C:\System Volume Information C:\temp.txt C:\Users C:\Windows
Метод exists() возвращает true
, если папка существует
Future<bool> exists()
Проверим существование ряда папок:
import 'dart:io'; void main() async { print(await Directory("C:\").exists()); print(await Directory("somefolder").exists()); }
Для переименования папки применяется метод rename()
Future<Directory> rename(String newPath);
В качестве параметра передается новый путь. А результатом метода является переименованный каталог в виде нового объекта Directory. Например, переименуем папку "hello" в "work":
import 'dart:io'; void main() async { // создаем папку "hello" var dir = await Directory("hello").create(); // переименовываем ее в "work" var new_dir = await dir.rename("work"); print(new_dir.path); // work }
Для удаления папки применяется метод delete()
Future<FileSystemEntity> delete({bool recursive = false})
В качестве параметра передается булевое значение - если оно равно true
, то удаляются также вложенные файлы и папки. Если же параметр равен false
,
как собственно по умолчанию, тогда при удалении папка должна быть пуста. Например, удалим папку "hello" в "work":
import 'dart:io'; void main() async { var dir = Directory("work"); await dir.delete(); print("${dir.path} deleted"); }
Для получение данных папки применяется метод stat():
Future<FileStat> stat()
Статистика представляет класс FileStat, который предоставляет ряд свойств:
accessed: время последнего доступа (объект DateTime)
changed: время последнего изменения данных папки/файла или их метаданных (объект DateTime)
modified: время последнего изменения данных папки/файла (объект DateTime)
size: размер
mode: режим файла
Получение статистики:
import 'dart:io'; void main() async { var dir = Directory.current; var stat = await dir.stat(); print(dir.path); print("Accessed datetime: ${stat.accessed}"); print("Modified datetime: ${stat.modified}"); print("Size: ${stat.size}"); }