3

库中的Filedart:io还不包括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();
  }
}

我也试过pipeprint(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);
}
4

2 回答 2

2

使用您的第一个代码片段,您会得到一个空文件,因为pipe它不是同步方法。因此,在执行 finally 块时,尚未开始将 inputStream 复制到 outputStream。通过关闭这个 finally 块中的流,你pipe甚至在它开始之前就停止了它。没有这个 finally 块,复制就会正确完成。

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

于 2013-01-25T22:03:59.887 回答
1

对于同步复制,使用:

File(sourceFile).copySync(destinationFile);

对于异步复制,请使用:

File(sourceFile).copy(destinationFile);
于 2021-03-15T16:05:30.573 回答