Dartディレクトリ削除

Dar言語StreamクラスtoSet()メソッドDart

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

コメント

タイトルとURLをコピーしました