如果我有这样的脚本
import 'package:path/path.dart' as p;
import 'dart:io';
import 'dart:async';
void main() async {
final inDir = p.join(Directory.current.path, 'tmp', 'in'); // should we rename this
var dir = Directory(inDir);
final List<FileSystemEntity> fileList = await dir.list().toList();
for (var file in fileList.where((entity) => entity is File) ) {
print ("Processing ${(file as File).toString()}");
final contents = (file as File).readAsStringSync();
print (contents);
}
}
它工作正常。
Processing File: 'C:\FlutterProjects\project\tmp\a.txt'
some text
但是如果我想获取文件路径以字符串形式传递给另一个函数
import 'package:path/path.dart' as p;
import 'dart:io';
import 'dart:async';
void main() async {
final inDir = p.join(Directory.current.path, 'tmp'); // should we rename this
var dir = Directory(inDir);
final List<FileSystemEntity> fileList = await dir.list().toList();
for (var file in fileList.where((entity) => entity is File) ) {
print ("Processing ${(file as File).toString()}");
readFile ((file as File).toString());
}
}
void readFile (String filePath) {
final file = File(filePath);
final contents = file.readAsStringSync();
print (contents);
}
...那么它就不起作用了...
Processing File: 'C:\FlutterProjects\project\tmp\a.txt'
Unhandled exception:
FileSystemException: Cannot open file, path = 'File: 'C:\FlutterProjects\project\tmp\a.txt'' (OS Error: The filename, directory name, or volume label syntax is incorrect.
, errno = 123)
#0 _File.throwIfError (dart:io/file_impl.dart:675:7)
#1 _File.openSync (dart:io/file_impl.dart:490:5)
#2 _File.readAsBytesSync (dart:io/file_impl.dart:574:18)
#3 _File.readAsStringSync (dart:io/file_impl.dart:624:18)
#4 readFile (file:///C:/FlutterProjects/project/bin/parse-files.dart:18:27)
#5 main (file:///C:/FlutterProjects/project/bin/parse-files.dart:11:5)
<asynchronous suspension>
我猜是因为它仍然以 File: 开头。所以我可以将其视为函数本身中的一个实体,或者我将字符串转换为不以 File: 开头,但我不明白为什么它不将文件的字符串作为文件发送(这正是我想要做的,以使函数更具可重用性)。
((file as File).toString());
TL;DR当文件是 FileEntity 时为什么不按我期望的方式执行。
调用 File 对象的输出
toString()
不是可用于某些内容的路径。如果您查看代码,调用的结果toString()
实际上File
是字符串:因此,您实际上最终要做的是:
这会失败,因为这不是一条有效路径,也不是您可以读取的内容。
您不应调用
toString()
,而应使用对象.path
上的属性File
。或者只需将File
as 参数发送给您的方法:此外,我已修复此代码中不必要的文件类型转换。如果您使用
whereType
,它实际上会根据类型检查进行过滤并返回正确类型的对象。