在 Dart 中,如果我知道一个文件的根目录和相对路径,如何为它创建一个文件实例?
Directory root = new Directory("/root");
String relativePath = "logs/users.log";
如何创建文件实例users.log
?
在java中,这很简单:
new File(root, relativePath);
但是在 Dart 中,我找不到一个简单的解决方案。
这是我找到的最简单的解决方案
import 'package:path/path.dart' as path;
...
String filePath = path.join(root.path, relativePath);
filePath = path.normalize(filePath);
File f = new File(filePath);
/home/name/
并../name2
让步/home/name2
感谢 Günter Zöchbauer 的提示。
似乎 linux 盒子可以处理类似/home/name/../name2
.
在 Windows 机器上,Path.normalize
需要使用,并且/
Path.normalize
必须删除头部的额外前置。
或者使用新的 Path.Context():
import 'package:path/path.dart' as Path;
import 'dart:io' show Platform,Directory;
to_abs_path(path,[base_dir = null]){
Path.Context context;
if(Platform.isWindows){
context = new Path.Context(style:Path.Style.windows);
}else{
context = new Path.Context(style:Path.Style.posix);
}
base_dir ??= Path.dirname(Platform.script.toFilePath());
path = context.join( base_dir,path);
return context.normalize(path);
}
我发现这个问题是在我的测试脚本文件中找到文件的相对路径,所以我改进了@TastyCatFood 的答案以在该上下文中工作。以下脚本可以在每个位置找到文件的相对文件:
import 'dart:io';
import 'package:path/path.dart' as path;
/// Find the path to the file given a name
/// [fileName] : file name
/// [baseDir] : optional, base directory to the file, if not informed, get current script path.
String retrieveFilePath(String fileName, [String baseDir]){
var context;
// get platform context
if(Platform.isWindows) {
context = path.Context(style:path.Style.windows);
} else {
context = path.Context(style:path.Style.posix);
}
// case baseDir not informed, get current script dir
baseDir ??= path.dirname(Platform.script.path);
// join dirPath with fileName
var filePath = context.join(baseDir, fileName);
// convert Uri to String to make the string treatment more easy
filePath = context.fromUri(context.normalize(filePath));
// remove possibles extra paths generated by testing routines
filePath = path.fromUri(filePath).split('file:').last;
return filePath;
}
以下示例读取文件同一文件夹中的文件data.txtmain.dart
:
import 'package:scidart/io/io.dart';
main(List<String> arguments) async {
File f = new File('data.txt');
}