7

在 Dart 中,如果我知道一个文件的根目录和相对路径,如何为它创建一个文件实例?

Directory root = new Directory("/root");
String relativePath = "logs/users.log";

如何创建文件实例users.log

在java中,这很简单:

new File(root, relativePath);

但是在 Dart 中,我找不到一个简单的解决方案。

4

3 回答 3

6

这是我找到的最简单的解决方案

import 'package:path/path.dart' as path;

...

String filePath = path.join(root.path, relativePath);
filePath = path.normalize(filePath);
File f = new File(filePath);
于 2014-03-03T14:26:13.247 回答
2

加入/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);
}
于 2016-03-21T10:21:50.440 回答
0

我发现这个问题是在我的测试脚本文件中找到文件的相对路径,所以我改进了@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');
}
于 2019-07-26T20:14:06.293 回答