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()); // 先註釋 不然會截斷文件