file-io - Windows 中的 Dart 文件复制

标签 file-io dart

File dart:io中的类(class)库尚未包含 copy()move()方法。

为了让我渡过难关,直到他们到达,我正在尝试推出自己的复制功能。我在 Windows 上使用下面的代码,但它只创建一个 0kb 文件。

void copyFile(String input, String output) {
  var inFile = new File(input), outFile = new File(output);
  if (outFile.existsSync()) outFile.deleteSync(); // I realize this isn't required
  var inStream = null, outStream = null;
  try {
    inStream = inFile.openInputStream();
    outStream = outFile.openOutputStream(FileMode.WRITE);
    inStream.pipe(outStream);
  } finally {
    if (outStream != null && !outStream.closed) outStream.close();
    if (inStream != null && !inStream.closed) inStream.close();
  }
}

我还尝试更换 pipe符合print(inStream.read(100).toString());我得到 null 。输入文件确实存在(否则我会得到 FileIOException)。我是否做错了什么,或者输入流在 Windows 下被破坏了?

我正在使用:

  • Dart 编辑器版本 0.3.1_r17463
  • Dart SDK 版本 0.3.1.2_r17463

编辑:以下内容有效(尽管它不“分块”)。我是否错误地使用了上面的流?

void copyFile(String input, String output) {
  var inFile = new File(input), outFile = new File(output);
  if (outFile.existsSync()) outFile.deleteSync(); // I realize this isn't required
  outFile.writeAsBytesSync(inFile.readAsBytesSync(), FileMode.WRITE);
}

最佳答案

使用第一个代码片段时,您会得到一个空文件,因为 pipe 不是同步方法。因此,当执行finally block 时,inputStream到outputStream的复制尚未开始。通过关闭此finally block 中的流,您可以在管道 启动之前将其停止。如果没有这个finally block ,复制就会正确完成。

void copyFile(String input, String output) {
  final inStream = new File(input).openInputStream();
  final outStream = new File(output).openOutputStream(FileMode.WRITE);
  inStream.pipe(outStream);
}

最后,您不必担心关闭流,因为一旦实现,pipe 就会默认关闭流。请参阅InputStream.pipe .

关于file-io - Windows 中的 Dart 文件复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528280/

相关文章:

c - 将文件读入字符串数组 C

dart - 如何链接到包含 Web 组件构造函数的外部 Dart 库?

c++ - 如何在 C++ 中创建缓冲区以创建新文件

Dart pub global run 无法解析脚本名称

dart - 在angular.dart中使用select指令的正确方法是什么

dart - Flutter:自定义 ExpansionTile

dart - 使用 Dart 编辑器中的标志启动 Dartium

c# - 在哪里存储自定义配置文件

c - 将文件的每一行存储在 C 结构中,但忽略//之后的部分行

c# - 读取文件的最后 30,000 行