3
import 'dart:io';

void main() {
  var path = Platform.script.path;
  print(path);
}

输出

/C:/Users/user/dart/test/bin/test.dart

但我想得到

C:/Users/user/dart/test/bin/test.dart

什么是让操作系统特定路径准备好在这个操作系统中使用的推荐方法?

附言

如果我在不同的平台上运行测试代码,我会得到不同的结果。

所以,测试。

运行时:Dart SDK 版本 1.1.1 (STABLE)

代码:

import 'dart:io';

void main() {
  var path = Platform.script.path;
  print(path);
  // From doc: Creates a new file URI from an absolute or relative file path.
  var uri = new Uri.file(path);
  print(uri.path);
}

Ubuntu 13.10:

/home/andrew/dart/test/bin/test.dart
/home/andrew/dart/test/bin/test.dart

Windows 7的:

/C:/Users/user/dart/test/bin/test.dart
Breaking on exception: Illegal argument(s): Illegal character in path}
Unhandled exception:
Illegal argument(s): Illegal character in path}

这种行为使我无法编写跨平台代码。

4

2 回答 2

2

此代码适用于所有平台。

import 'dart:io';

void main() {
  var path = Platform.script.toFilePath();
  print(path);
  var uri = new Uri.file(path);
  print(uri.toFilePath());
}

附言

Illegal character in path当使用方案 ""dart-ext" 时,Dart SDK 内部(在某些情况下)可能会发生类似的异常 ( ):

Unhandled exception:
Unsupported operation: Illegal character in path}
#0      Uri._checkWindowsPathReservedCharacters.<anonymous closure> (dart:core/uri.dart:395)
#1      ListIterable.forEach (dart:_collection-dev/iterable.dart:39)
#2      Uri._checkWindowsPathReservedCharacters (dart:core/uri.dart:390)
#3      Uri._toWindowsFilePath (dart:core/uri.dart:1018)
#4      Uri.toFilePath (dart:core/uri.dart:992)
#5      _filePathFromUri (dart:builtin:249)
'package:dart_and_cpp_classes/src/cpp_extension.dart': error: line 3 pos 1: library handler failed
import "dart-ext:cpp_extension";
^
'package:dart_and_cpp_classes/cpp_extension.dart': error: line 3 pos 1: library handler failed
import 'package:dart_and_cpp_classes/src/cpp_extension.dart';
^
'file:///C:/Users/user/dart/dart_and_cpp_classes/bin/use_cpp_extension.dart': error: line 1 pos 1: library handler failed
import 'package:dart_and_cpp_classes/cpp_extension.dart';
^
于 2014-01-19T10:43:29.460 回答
1

看看路径包import package:path/path.dart
我没有在此处运行 Windows,因此无法验证任何内容。

看了一眼,我发现:

/// An enum type describing a "flavor" of path.
abstract class Style {
  /// POSIX-style paths use "/" (forward slash) as separators. Absolute paths
  /// start with "/". Used by UNIX, Linux, Mac OS X, and others.
  static final posix = new PosixStyle();

  /// Windows paths use "\" (backslash) as separators. Absolute paths start with
  /// a drive letter followed by a colon (example, "C:") or two backslashes
  /// ("\\") for UNC paths.
  // TODO(rnystrom): The UNC root prefix should include the drive name too, not
  // just the "\\".
  static final windows = new WindowsStyle();

  /// URLs aren't filesystem paths, but they're supported to make it easier to
  /// manipulate URL paths in the browser.
  ///
  /// URLs use "/" (forward slash) as separators. Absolute paths either start
  /// with a protocol and optional hostname (e.g. `http://dartlang.org`,
  /// `file://`) or with "/".
  static final url = new UrlStyle();
于 2014-01-19T00:11:54.410 回答