File io Windows中的Dart文件复制

File io Windows中的Dart文件复制,file-io,dart,File Io,Dart,dart:io库中的File类尚未包含copy()和move()方法 为了让我度过难关直到他们到来,我正在尝试使用我自己的复制功能。我在Windows上使用下面的代码,但它只创建了一个0kb的文件 void copyFile(字符串输入,字符串输出){ var inFile=新文件(输入),outFile=新文件(输出); if(outFile.existsSync())outFile.deleteSync();//我意识到这不是必需的 var-inStream=null,outtream=nu

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

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

void copyFile(字符串输入,字符串输出){
var inFile=新文件(输入),outFile=新文件(输出);
if(outFile.existsSync())outFile.deleteSync();//我意识到这不是必需的
var-inStream=null,outtream=null;
试一试{
inStream=infle.openInputStream();
outStream=outFile.openOutputStream(FileMode.WRITE);
河道内管道(河道外);
}最后{
如果(outStream!=null&!outStream.close)outStream.close();
如果(inStream!=null&!inStream.close)inStream.close();
}
}
我还尝试将
管道
行替换为
打印(inStream.read(100.toString())我得到
null
。输入文件确实存在(否则我会得到一个FileIOException)。我是做错了什么,还是Windows下的输入流被破坏了

我正在使用:

  • Dart编辑器版本0.3.1r17463
  • Dart SDK版本0.3.1.2_r17463
编辑:以下功能有效(尽管它不“块”)。我是否错误地使用了上面的流

void copyFile(字符串输入,字符串输出){
var inFile=新文件(输入),outFile=新文件(输出);
if(outFile.existsSync())outFile.deleteSync();//我意识到这不是必需的
outFile.writeAsBytesSync(infle.readAsBytesSync(),FileMode.WRITE);
}

对于第一个代码片段,您得到的是一个空文件,因为
管道
不是同步方法。因此,在执行finally块时,inputStream到outputStream的复制尚未开始。通过关闭此finally块中的流,可以在管道启动之前停止管道。如果没有最后的块,拷贝就正确完成了

void copyFile(字符串输入,字符串输出){
final inStream=新文件(input).openInputStream();
最终输出流=新文件(output).openOutputStream(FileMode.WRITE);
河道内管道(河道外);
}

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

有关同步复制,请使用:

文件(sourceFile).copySync(destinationFile);
对于异步复制,请使用:

文件(sourceFile).copy(destinationFile);

我想问题可能是我试图同步访问流?也许我上面的代码在数据到达之前关闭了流?这是否意味着我想在拷贝之后做的任何事情都必须放在将来(例如
.then()
)?如果pipe()不返回未来,如何执行此操作?我是否需要向流对象添加“事件处理程序”?(如果我把术语弄错了,很抱歉;仍然习惯于省道语义)。有什么同步的方法吗?