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/