一统天下 flutter - 存储: File, Directory - 文件操作, 目录操作

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - 存储: File, Directory - 文件操作, 目录操作

示例如下:

lib\storage\file.dart

/*
 * File - 文件操作
 * Directory - 目录操作
 * File 和 Directory 都继承自 FileSystemEntity
 */

import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/services.dart' show Uint8List, rootBundle;

import '../helper.dart';

class FileDemo extends StatefulWidget {
  const FileDemo({Key? key}) : super(key: key);

  @override
  _FileDemoState createState() => _FileDemoState();
}

class _FileDemoState extends State<FileDemo> {

  String _content = "";
  Uint8List _imageData = Uint8List.fromList([]);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("title"),),
      backgroundColor: Colors.orange,
      body: Center(
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                /// 根据文件路径实例化 File 对象
                final file = File('${dir.path}/data.txt');
                /// 在指定的文件写入指定内容的文本,文件不存在则创建,文件存在则重写
                await file.writeAsString("hello ${currentTimestamp()}", encoding: utf8);
              },
              child: const Text('写文本文件',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                /// 根据文件路径实例化 File 对象
                final file = File('${dir.path}/data.txt');
                /// 从指定的文件读取文本内容
                final content = await file.readAsString(encoding: utf8);
                setState(() {
                  _content = content;
                });
              },
              child: const Text('读文本文件',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                /// 根据目录路径实例化 Directory 对象
                final myDir = Directory('${dir.path}/a/b/c');
                /// 判断目录是否存在
                var myDirExists = await myDir.exists();
                if (!myDirExists) {
                  /// 创建目录
                  /// recursive 为 true 则会递归创建多级目录
                  await myDir.create(recursive: true);
                }
              },
              child: const Text('创建目录',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                for (int i = 1; i < 10; i++) {
                  /// 根据文件路径实例化 File 对象
                  final file = File('${dir.path}/x/y/z/data$i.txt');
                  /// 判断文件是否存在
                  var fileExists = await file.exists();
                  /// 创建文件
                  /// recursive 为 true 则会递归创建多级目录
                  /// exclusive 为 true 则当文件存在时,会抛出异常
                  /// exclusive 为 false 则当文件存在时,不会做任何处理
                  file.create(recursive: true, exclusive: false);
                }
              },
              child: const Text('创建文件',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                /// 遍历指定的目录
                /// recursive 为 true 则会递归遍历多级目录
                var stream = dir.list(recursive: true);
                await for (final FileSystemEntity fse in stream) {
                  if (fse is File) {              /// 当前遍历出的结果是 File 对象
                    log('file: ${fse.path}');     /// File 的路径
                  } else if (fse is Directory) {  /// 当前遍历出的结果是 Directory 对象
                    log('dir: ${fse.path}');      /// Directory 的路径
                  }
                }
              },
              child: const Text('遍历目录和文件',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                final file = File('${dir.path}/son.jpg');
                var bytes = await rootBundle.load("assets/son.jpg");
                var imageData = bytes.buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes);
                /// 写入指定的二进制数据
                file.writeAsBytes(imageData);
              },
              child: const Text('写二进制数据',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                final file = File('${dir.path}/son.jpg');
                if (await file.exists()) {
                  /// 从指定的文件读取二进制内容
                  _imageData = await file.readAsBytes();
                  setState(() {});
                }
              },
              child: const Text('读二进制数据',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                final file = File('${dir.path}/son.jpg');
                if (await file.exists()) {
                  /// 删除指定的文件
                  await file.delete();
                }
                /// 删除指定的目录
                /// recursive 为 true 则会递归删除多级目录以及目录中的文件
                await dir.delete(recursive: true);
              },
              child: const Text('删除目录和文件',),
            ),
            ElevatedButton(
              onPressed: () async {
                var dir = await getApplicationDocumentsDirectory();
                final file = File('${dir.path}/son.jpg');
                /// 重命名
                /// await file.rename("new name");
                /// 复制文件
                /// await file.copy("new path");
                /// 获取当前文件的目录
                /// var parentDir = file.parent;
                /// 获取文件的大小
                /// var length = await file.length();
                /// 获取文件的最近访问时间
                /// var lastAccessed = await file.lastAccessed();
                /// 获取文件的最近修改时间
                /// var lastModified = await file.lastModified();
                /// 设置文件的最近访问时间
                /// await file.setLastAccessed(DateTime.now());
                /// 设置文件的最近修改时间
                /// await file.setLastModified(DateTime.now());

                /// 获取当前文件的状态
                var stat = await file.stat();
                setState(() {
                  /// size - 文件大小
                  /// accessed - 最近访问时间
                  /// modified - 最近修改时间
                  /// type - 当前 FileSystemEntity 的类型
                  ///   FileSystemEntityType.file - 文件
                  ///   FileSystemEntityType.directory - 目录
                  ///   FileSystemEntityType.notFound - 不存在
                  _content = 'size:${stat.size}, accessed:${stat.accessed}, modified:${stat.modified}, type:${stat.type}';
                });
              },
              child: const Text('其他操作',),
            ),

            MyTextSmall(_content),
            Builder(
              builder: (BuildContext context) {
                if (_imageData.isEmpty) {
                  return Container();
                } else {
                  return Image.memory(_imageData,
                    width: 50,
                    height: 50,
                  );
                }
              }
            ),
          ],
        ),
      ),
    );
  }
}

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

posted @ 2023-05-06 14:41  webabcd  阅读(675)  评论(0编辑  收藏  举报