プログラム学習室 http://studyhallweb.com/

Dart言語: ファイルリストの取得

Sample Code

同期処理と非同期処理の両方の例を示す。
古い人間には同期処理のほうが分かりやすい(苦笑)

下位ディレクトリの中まで再帰的にファイルリストを所得すること自体は簡単。
ディレクトリに対して.list(recursive: true)または.listSync(recursive: true)でListが簡単に作れる。
ただし、このListが単純なStringの配列とは違うので、その後の取り扱いが難しい。
詳しくは後日...。
				
import 'dart:io';

// ファイルリストを扱うクラス
class C_Dir {
  var sPath; // 対象のパス(ディレクトリ名)
  var oDir;
  var nFilesCount; // ファイル数
  var nDirsCount; // ディレクトリ数
  FileSystemEntity oFiles;

  // 対象のPathをセット
  setPath(var sPath) {
    oDir = new Directory(sPath);
  }

  // 同期処理でのファイルリスト
  getSync() {
    List<FileSystemEntity> sFile = oDir.listSync(recursive: true);
    nFilesCount = 0; // ファイル数
    nDirsCount = 0; // ディレクトリ数

    sFile.forEach((oFiles) {
      if (oFiles is File) {
        nFilesCount += 1;   // ファイル数カウント
        print('Sync file ${oFiles.path}');
      } else if (oFiles is Directory) {
        nDirsCount += 1;
        print('Sync Dir ${oFiles.path}');
      }
    });
    print('File N=$nFilesCount');
    print('Dir N=$nDirsCount');
  }

  // 非同期処理でのファイルリスト
  getFiles() {
    var oStream = oDir.list(recursive: true);
    oStream.listen((oFiles) {
      if (oFiles is File) {
        // ループでファイル数をカウントすることは出来ない
        print('Stream file ${oFiles.path}');
      } else if (oFiles is Directory) {
        print('Stream dir ${oFiles.path}');
      }
    }, onError: (e) {
      print(e.toString());
    });
  }
}

main() {
  C_Dir cDir = new C_Dir();
  cDir.setPath('C:\\Temp\\Test');
  cDir.getFiles();
  cDir.getSync();
}