如何在Dart SDK中将路径作为字符串而不在Windows中引导“斜杠”?

时间:2014-01-18 17:23:36

标签: windows path dart uri dart-sdk

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

建议在此操作系统中使用OS特定路径的方法是什么?

P.S。

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

所以,测试。

运行时: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}

此行为阻止我编写跨平台代码。

2 个答案:

答案 0 :(得分:2)

此代码适用于所有平台。

import 'dart:io';

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

P.S。

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

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';
^

答案 1 :(得分: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();