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());  // 先註釋 不然會截斷文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章