Dartのディレクトリ削除について調査したのでメモ書き。
先ずは「dart:io」パッケージをimport。
import 'dart:io';
Directoryクラスにはディレクトリを削除するメソッドが2つ用意されている。
一つは非同期で削除するdelete()。もう一つは同期で削除するdeleteSync()。
Directoryクラスはブロッキングしない非同期を推奨しているので、delete()を試す。
削除用のディレクトリを作成。
% mkdir -p dir/subdir
% ls -d dir/subdir
dir/subdir/
削除処理をコーディング。
exists()でディレクトリの存在確認後に削除する。ちなみにexistsSync()も存在する。
delete()には配下のディレクトリ・ファイルを再帰的に削除するための引数「recursive: true」がある。デフォルトはfalse。
今回はサブディレクトリが存在するので、このまま実行するとエラーが発生する。
バッチ処理でありがちなエラーなので、確認しておく。
import 'dart:io';
void main() async {
try {
// ディレクトリの存在確認
if (await Directory('dir').exists()) {
// ディレクトリを削除
await Directory('dir').delete();
}
} catch (e, st) {
// 例外処理
print('Error:$e\nStackTrace:$st');
}
}
実行結果。
例外が発生する。
% dart run bin/dir1.dart
Error:FileSystemException: Deletion failed, path = 'dir' (OS Error: Directory not empty, errno = 66)
StackTrace:#0 _checkForErrorResponse (dart:io/common.dart:42:9)
#1 _Directory._delete.<anonymous closure> (dart:io/directory_impl.dart:185:7)
<asynchronous suspension>
#2 main (file:///Users/********/app/dart/dir1/bin/dir1.dart:8:7)
<asynchronous suspension>
「recursive: true」を追加して再実行。
import 'dart:io';
void main() async {
try {
// ディレクトリの存在確認
if (await Directory('dir').exists()) {
// ディレクトリを削除
await Directory('dir').delete(recursive: true);
}
} catch (e, st) {
// 例外処理
print('Error:$e\nStackTrace:$st');
}
}
実行結果。
ディレクトリが削除される。
% dart run bin/dir1.dart
# ディレクトリが存在しないのでlsコマンドでディレクトリを指定するとエラーになる
% ls -d dir/subdir
ls: dir/subdir: No such file or directory
コメント