Flutter中目录(Directory)和文件(File)常用操作

1. 目录(Directory)

1.1 导入

import 'dart:io';       // Directory所在的包
import 'dart:convert';  // 

1.2 创建实例

// 根据路径字符串创建目录对象
Directory dir=new Directory("assets\\files");
//  根据Uri对象创建目录对象
// Directory dir=new Directory.fromUri(Uri(path: "assets"));
// 根据Uint8List路径创建实例 Utf8Encoder().convert()将字符串转换成Uint8List
// Directory.fromRawPath(Utf8Encoder().convert("assets\\files"));

1.3 属性

// String path 获取此目录的路径
print(dir.path);

// Uri 返回表示目录位置的uri
print(dir.uri);

// 父目录的Directory对象
print(dir.parent);

// absolute 返回一个绝对路径的Directory对象
print(dir.absolute);

// 判断是否是绝对路径
print(dir.isAbsolute);

1.4 方法

// create({bool recursive: false}) → Future<Directory> 根据路径创建目录 recursive是否递归创建 递归创建的意思就是 即便路径中有目录不存在 全部都会创建出来
await dir.create(recursive: true);

// createTemp([String prefix]) → Future<Directory> 在此目录中创建一个临时目录,其他随机字符将附加到prefix以产生唯一的目录名称. 
await dir.createTemp();

// list({bool recursive: false, bool followLinks: true}) → Stream<FileSystemEntity>
// recursive是否递归列出子目录 followLinks是否允许link
await dir.list().toList().then((value) => print(value));

// rename(String newPath) → Future<Directory> 重命名目录

// resolveSymbolicLinks() → Future<String> 解析文件系统对象相对于当前工作目录的路径 解析路径上的所有符号链接,并解析所有..和. 路径段 返回一个类似绝对路径的字符串
await dir.absolute.resolveSymbolicLinks().then((value) => print(value));

// 查看目录是否存在
await dir.exists().then((value) => print(value));

// delete({bool recursive: false}) → Future<FileSystemEntity> 删除文件目录 
// 默认情况下 只能删除空目录 将recursive设置为true 才可以递归删除目录中所有的文件和目录
await dir.delete(recursive: true).then((value) => print(value)).catchError((err)=>{print(err)});

// stat() → Future<FileStat> 查看目录信息
// type directory                     类型:目录
// changed 2020-05-29 11:14:50.000    文件系统对象的数据或元数据的最后更改时间
// modified 2020-05-29 11:15:01.000   最后一次更改文件系统对象的数据的时间
// accessed 2020-05-29 11:15:01.000   上次访问文件系统对象的数据的时间
// mode rwxrwxrwx                     文件系统对象的模式 r(read) w(write) x(execute) 读写执行
// size 0                             文件大小
await dir.stat().then((value) => print(value));

2.文件(File)

2.1 导入

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

2.2 创建实例

// 根据文件路径字符串创建文件实例
File file=new File("assets/index.txt");
// 根据Uri对象创建文件实例
File file2=new File.fromUri(Uri(path: "assets/index.txt"));
Utf8Codec utf=Utf8Codec();
// 根据Uint8List文件路径创建实例 Utf8Encoder().convert()将字符串转换成Uint8List
File file3=File.fromRawPath(Utf8Encoder().convert("assets\\files\\index.txt"));

2.3 方法

// 打印一下file实例对象
print(file);   // File: 'assets\files\index.txt'

// 返回绝对路径的File实例
print(file.absolute); // File: 'C:\Users\Administrator.PW6NUH21X31RM79\Desktop\Dart\assets\files\index.txt'

// 获取文件路径
print(file.path); // assets\files\index.txt

// 是否是绝对路径
print(file.isAbsolute);  // fasle

// 获取父目录的Directory对象
print(file.parent);  // Directory: 'assets\files'

// 获取uri
print(file.uri);   // assets/files/index.txt

2.4 方法

// 1. copy(String newPath) 复制文件  copySync(String newPath) 同步复制文件
// 新路径的目录必须存在 否则报错
// 若新路径下已有同名文件 则覆盖
await file.copy("assets/image/index.txt").then((value) => print(value));

// 2. create({bool recursive: false})创建文件 
// createSync({bool recursive: false}) 同步创建文件
// 可选命名参数:recursive 默认false, 
// 若为true  则路径中有目录不存在时 会递归创建目录 
// 若为false 则路径中的目录不存在时 会报错
File file2=new File("assets/files/text.txt");
await file2.create();

// 3.lastAccessed() 获取文件上次访问时间  lastAccessedSync()同步获取
print(await file.lastAccessed()); // 2020-05-30 10:39:35.000
// setLastAccessed(Datetime time)  修改文件上次访问时间 +Sync 同步
await file.setLastAccessed(new DateTime.now());

// 4. lastModified() 获取文件最后修改时间 lastModifiedSync()同步获取
print(await file.lastModified());
// setLastModified(DateTime time)  修改文件的最后修改时间 +Sync 同步
await file.setLastModified(new DateTime.now());

// 5. length()获取文件长度(字节数) lengthSync() 同步获取
print(await file.length());

// 6. rename(String newPath) 重命名 renameSync(String newPath)
// 若新路径和旧路径在同一个目录下 那么仅仅是重命名
// 若新路径和旧路径不在一个目录下 那么就是移动文件加重命名 
file.rename("index.txt");

// 7. 读取
// 7.1 readAsString()以字符串形式读取 readAsStringSync() 同步读取
print(await file.readAsString());
// 7.2 readAsBytes()以字节形式读取   readAsBytesSync() 同步读取
print(await file.readAsBytes());     
// 7.3 readAsLines()按行读取 返回字符串数组    readAsLinesSync() 同步读取
print(await file.readAsLines());

// 8. 写入
// 8.1 writeAsString() 以字符串方式写入
file.writeAsString("Dart ",
mode: FileMode.append,// 写入的模式 append(追加写入) read(只读) write(读写) writeOnly(只写)  writeOnlyAppend(只追加)
flush: true,    // 如果flush设置为`true` 则写入的数据将在返回之前刷新到文件系统 
encoding:utf8,  // 设置编码
);
// 8.2 writeAsBytes() 写入字节数组 参数同上
file.writeAsBytes([1,2,3]);

// 9. delete() 删除文件  deleteSync() 同步删除文件
// await file.delete();

// 10. exists() 检查文件是否存在 existsSync() 同步检查文件是否存在
print(await file.exists());

// 11. resolveSymbolicLinks() 解析文件系统对象相对于当前工作目录的路径 +Sync同步
print(await file.resolveSymbolicLinks());

// 12. stat()  获取文件对应的FileStat对象 StatSync() 同步获取
// 包含type(类型) 
// changed(文件系统对象的数据的最后修改时间) 
// modified(最后一次更改文件系统对象的数据的时间)
// accessed(上次访问时间)
// size(文件大小)  
print(await file.stat());

// 13和14涉及流(Stream)的操作 之后会继续更新异步和流
// 13. openRead() 为文件的内容创建一个Stream(流) 
print(file.openRead());

// 14. openWrite() 为文件创建一个IOSink,使用结束需要释放资源
// print(file.openWrite());  // 先注释 不然会截断文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章