Работа с файловой системой

Работа с каталогами

Последнее обновление: 12.04.2023

Для работы с файловой системой и вообще системой ввода/ввода в языке 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}");  
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850