3

ライブラリ内のFileクラスには、メソッドdart: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();
  }
}

pipeまた、行を次のprint(inStream.read(100).toString());ように置き換えてみましたが、null. 入力ファイルは存在します (存在しないと、FileIOException が発生します)。何か間違ったことをしていますか、それとも Windows で入力ストリームが壊れていますか?

私は使用しています:

  • Dart Editor バージョン 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開始する前に停止します。その最終ブロックがなければ、コピーは正しく行われます。

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

最後に、ストリームを閉じることについて心配する必要はありませんpipeInputStream.pipを参照してください。

于 2013-01-25T22:03:59.887 に答える