You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter调用writeAsBytes报PathNotFoundException问题求助

Flutter PathNotFoundException 解决:无法将Assets文件写入临时目录

问题描述

我使用以下Flutter函数尝试将Assets中的文件复制到应用临时目录:

Future<File> getFile(String fileName) async {
  final appDir = await getTemporaryDirectory();
  final appPath = appDir.path;
  final fileOnDevice = File('$appPath/$fileName');
  final rawAssetFile = await rootBundle.load(fileName);
  final rawBytes = rawAssetFile.buffer.asUint8List();
  await fileOnDevice.writeAsBytes(rawBytes, flush: true);
  return fileOnDevice;
}

通过final dataFile = await getFile('assets/sample.txt');调用时,持续抛出异常:

PathNotFoundException: Cannot open file, path = '/var/mobile/Containers/Data/Application/352527E9-XXXX-XXXX-XXXX-DCFXXXXXXXXX/Library/Caches/assets/

已尝试的方法

  • 确认Assets文件夹内文件名正确,且在组件、main函数等不同位置测试过代码
  • 分别在Xcode和VS Code中运行项目
  • 在Android模拟器和iPhone真机上测试代码

解决方案

核心问题是目标文件的父目录未创建:拼接路径时,assets子目录并不存在,直接写入文件会因目录缺失报错。

修改后的代码(需导入path包):

import 'dart:io';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;

Future<File> getFile(String fileName) async {
  final appDir = await getTemporaryDirectory();
  // 拼接完整目标路径
  final targetFilePath = path.join(appDir.path, fileName);
  // 获取目标文件的父目录
  final targetDir = path.dirname(targetFilePath);

  // 递归创建父目录(如果不存在)
  await Directory(targetDir).create(recursive: true);

  final fileOnDevice = File(targetFilePath);
  final rawAssetFile = await rootBundle.load(fileName);
  final rawBytes = rawAssetFile.buffer.asUint8List();
  await fileOnDevice.writeAsBytes(rawBytes, flush: true);
  return fileOnDevice;
}

额外检查项

  1. 确保pubspec.yaml中正确声明Assets资源:
    flutter:
      assets:
        - assets/sample.txt
    
  2. 执行flutter clean后再运行flutter pub get,确保资源被正确打包到应用中

内容的提问来源于stack exchange,提问作者JengaAttack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:25:30