dart 文件目录操作

1. 文件读写

File file = File("XXX");
file.exists();//在假设为文件的时候判定文件是否存在,如果是目录返回false
// dart 文件读写,有些需要自己关闭,有些自动关闭,如果不是自己关闭的,那个如果冲突了,就不能写入,因此最好使用需要自己关闭的,这也是GC等效率问题
File(XXX)这样获取的都是不能手动关闭的,需要dart的GC来关闭
File("").openRead();//读没有关闭
File("").openWrite();//写有关闭
/// 文件读
import "dart:io";
import 'dart:convert';

Future<void> main() async {
  File file = File("static/test.txt");
  Stream<List<int>> intListStream = file.openRead();
  //第一种读取
  await for(var list in intListStream){
    print(String.fromCharCodes(list));
  }

  // 官网读取
  Stream<String> lines = file.openRead()
  // dart:convert
      .transform(utf8.decoder)       // Decode bytes to UTF-8.
      .transform(LineSplitter());    // Convert stream to individual lines.
  try {
    await for (var line in lines) {
      print('$line: ${line.length} characters');
    }
    print('File is now closed.');
  } catch (e) {
    print('Error: $e');
  }

  // 第二种读取全部
  intListStream.toList().then((value){
    print(String.fromCharCodes(value[0]));
  });

  // 仍然可用
  print(file.readAsStringSync());
}

/// 文件写入
// 写法一
import "dart:io";

Future<void> main() async {
  File file = File("static/test.txt");
  IOSink sink = file.openWrite();
  sink.write("""
  1,2
  3,4
  """);
  sink.flush();
  Future.microtask(() async {
    await sink.done;
    sink.close();
  });
}

//官网做法
void main() {
  var file = File('file.txt');
  var sink = file.openWrite();
  sink.write('FILE ACCESSED ${DateTime.now()}\n');

  // Close the IOSink to free system resources.
  sink.close();
}

想要将数据迅速写入文件中,可以将文件写入的过程放在一个Future.microtask()里面
sink.flush();
sink.close();连着使用报错
This seems to be working as intended. Calling close while an addStream is still active will give this result, not close the addStream.I've been wanting to change that, allowing you to use add, addError and close during an addStream, but it has not been a high priority.
https://github.com/dart-lang/sdk/issues/41707

2. 目录

Directory directory = Directory("XXX");
directory .exists();//在假设为文件的时候判定文件是否存在,如果是文件返回false
directory.list().toList();// 返回一个Future
Directory("").absolute.path;//得到的是当前的绝对路径

3. FileSystemEntity

FileSystemEntity.isFileSync("path");//同步判定否为文件
FileSystemEntity.isDirectorySync("path");//同步判断是否为目录

4. 官网:https://api.dart.dev/stable/2.18.6/dart-io/File-class.html

注意:子进程获取的地址和主进程(不是线程)的关系

子进程通过Directory("").absolute.path获取的路径是主进程的可执行文件(exe)的绝对路径