Для работы с файловой системой и вообще системой ввода/ввода в языке 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}");
}