exec method

Future<void> exec(
  1. {required String filePath,
  2. required String folderName,
  3. required String fileName}
)

Implementation

Future<void> exec({
  required String filePath,
  required String folderName,
  required String fileName,
}) async {
  try {
    // ソースファイルの読み込みストリームを開く
    final sourceFile = File(filePath);
    final sourceFileStream = sourceFile.openRead();

    late Directory directory;

    if (_isAndroid) {
      /// Androidの場合、外部ストレージに保存する
      final directoryOptional = await getExternalStorageDirectory();

      if (directoryOptional == null) {
        throw ServiceException(
          ServiceErrorType.directoryNotAccessError,
          ServiceErrorType.directoryNotAccessError.message,
        );
      }

      directory = directoryOptional;
    } else {
      /// iOSの場合、アプリ内に保存する
      directory = await getApplicationDocumentsDirectory();
    }

    // 保存先のディレクトリパス
    final saveDirectoryPath = '${directory.path}/$folderName';

    // 保存先のディレクトリ
    final saveDirectory = Directory(saveDirectoryPath);

    // 保存先のディレクトリが存在しない場合、作成する
    if (!saveDirectory.existsSync()) {
      saveDirectory.createSync();
    }

    // 保存先のファイル
    final file = File('$saveDirectoryPath/$fileName');

    // ターゲットファイルの書き込みストリームを開く
    final fileStream = file.openWrite();

    // ソースストリームからターゲットストリームにデータをパイプする
    await sourceFileStream.pipe(fileStream);

    // 書き込みが完了したらフラッシュし、ストリームを閉じる
    await fileStream.flush();
    await fileStream.close();

    return;
  } on ServiceException catch (_) {
    rethrow;
  } catch (e) {
    throw ServiceException(
      ServiceErrorType.fileSaveError,
      ServiceErrorType.fileSaveError.message,
    );
  }
}