Для работы с файлами библиотека dart:io определяет класс File, а для работы с папками - класс Directory
Для создания объекта класс File предоставляет фабричный конструктор, в который передается в качестве параметра путь к файлу:
File(String path)
Например, определим файл:
import 'dart:io'; // для работы с File void main () { File file = File("hello.txt"); print(file.path); // hello.txt }
Для работы с файлами прежде всего необходимо подключить библиотеку "dart:io":
import 'dart:io';
В функции main определяем объект File, который будет использовать файл "hello.txt".
File file = File("hello.txt");
Поскольку передан относительный путь, то предполагается, что файл "hello.txt" будет располагаться в корневом каталоге текущего проекта (или папке текущего файла программы, если запускается не проект, а просто скрипт Dart). Причем не важно, что такого файла нет, далее мы его создадим.
Для получения информации о файле класс File предоставляет ряд свойств, из которых можно отметить свойство path, которое возвращает путь к файлу.
Для получения абсолютного пути к файлу применяется свойство absolute. Оно возвращает объект File с абсолютным путем:
import 'dart:io'; void main () { File file = File("hello.txt"); print(file.path); // hello.txt print(file.absolute.path); // c:\dart\hello.txt }
Для создания файла применяется метод create()
Future<File> create({bool recursive = false, bool exclusive = false});
Первый параметр метода определяет поведение при создании файла в подкаталогах. Если параметр recursive
равен false
,
то файл создается, если только существуют все каталоги из пути к нему. Если параметр recursive
равен true
, то любой несуществующий каталог
из пути к файлу создается автоматически.
Второй параметр определяет поведение, если файл уже существует. При значении false
(по умолчанию), если файл по указанному пути существует, то ничего не происходит.
Если же параметр равен true
, и файл уже существует, то генерируется исключение FileSystemException.
Например, создадим в текущем каталоге файл "hello.txt":
import 'dart:io'; void main () async{ File file = File("hello.txt"); await file.create(); print("File has been created"); }
Если нам надо создать файл во вложенном каталоге, который неизвестно существует или нет, то в метод лучше передать параметр recursive
со значением true
:
import 'dart:io'; void main async() { File file = File("somefolder/hello.txt"); await file.create(recursive:true); print("File has been created"); }
Для копирования файла применяется функция copy(), в которую передается путь, по которому будет располагаться скопированный файл:
Future<File> copy(String newPath);
Результатом функции является скопированный файл.
Например, скопируем файл "hello.txt" в "work.txt":
import 'dart:io'; void main () async{ // сначала создаем файл "hello.txt" File file = await File("hello.txt").create(); // затем копируем его в "work.txt" File fileCopy = await file.copy("work.txt"); print("File ${file.path} has been copied to ${fileCopy.path}"); }
Метод exists() возвращает true
, если файл существует
Future<bool> exists()
Проверим существование ряда файлов:
import 'dart:io'; void main () async{ print(await File("hello.txt").exists()); print(await File("somefile.dat").exists()); }
Для переименования файла применяется метод rename()
Future<FileSystemEntity> rename(String newPath);
В качестве параметра передается новый путь. А результатом метода является переименованный файл в виде нового объекта File. Например, переименуем файл "hello.txt" в "hello1235.txt":
import 'dart:io'; void main() async { // создаем файл "hello.txt" var file = await File("hello.txt").create(); // переименовываем его в "hello12345.txt" var new_file = await file.rename("hello12345.txt"); print("File ${file.path} renamed to ${new_file.path}"); }
Для удаления файла применяется метод delete()
Future<FileSystemEntity> delete({bool recursive = false})
Результатом функции является удаленный файл. Стоит отметить, что если файл не существует, то генерируется исключение, поэтому перед удалением желательно проверять наличие файла. Например, удалим файл "work.txt":
import 'dart:io'; void main() async { var file = File("work.txt"); // если файл существует if(await file.exists()){ await file.delete(); print("${file.path} deleted"); } }
Для получение данных папки применяется метод stat():
Future<FileStat> stat()
Статистика представляет класс FileStat, который предоставляет ряд свойств:
accessed: время последнего доступа (объект DateTime)
changed: время последнего изменения данных папки/файла или их метаданных (объект DateTime)
modified: время последнего изменения данных папки/файла (объект DateTime)
size: размер
mode: режим файла
Получение статистики:
import 'dart:io'; void main() async { final file = await File("hello.txt").create(); final stat = await file.stat(); print(file.path); print("Accessed datetime: ${stat.accessed}"); print("Modified datetime: ${stat.modified}"); print("Size: ${stat.size}"); }
Кроме того, класс File
предоставляет ряд методов для получения аналогичных данных:
lastAccessed(): возвращает время последнего доступа к файлу в виде объекта DateTime
lastModified(): возвращает время последнего изменения файла в виде объекта DateTime
length(): возвращает размер файла в байтах
Применение методов:
import 'dart:io'; void main() async { final file = await File("hello.txt").create(); print(file.path); final lastAccessed = await file.lastAccessed(); final lastModified = await file.lastModified(); final length = await file.length(); print("Accessed datetime: $lastAccessed"); print("Modified datetime: $lastModified"); print("Size: $length"); }