Electronアプリケーションがあり、ノードのfs
モジュールを使用してファイルをコピーするサービスを作成しました。 data
イベントを聞いていないときはファイルコピーが正常に機能しますが、イベントを追加すると、出力ファイルが破損してしまいます(出力ファイルのサイズは常に元のファイルサイズより小さくなります)。ここで間違っているものをNodeJSのcreateReadStreamで 'data'イベントを受信すると、createWriteStreamに書き込まれたファイルが破損する
readStream.on('data', (buffer) => {
bytesCopied+= buffer.length
const response = new FileCopyResponseModel();
response.is_error = false;
response.is_done = false;
response.size = fileSize;
response.size_copied = bytesCopied;
copyResponse.next(response);
});
任意のアイデア:私はちょうどこのコードのセクションをコメントアウトした場合、正しく
copyFile(sourcePath: string, targetPath: string): Observable<FileCopyResponseModel> {
const copyResponse = new Subject<FileCopyResponseModel>();
const fileSize = this.node.fs.statSync(sourcePath).size;
const readStream = this.node.fs.createReadStream(sourcePath);
let bytesCopied = 0;
readStream.once("error", (err) => {
const response = new FileCopyResponseModel();
response.is_error = true;
response.error = err;
copyResponse.next(response);
});
readStream.on('data', (buffer) => {
bytesCopied+= buffer.length
const response = new FileCopyResponseModel();
response.is_error = false;
response.is_done = false;
response.size = fileSize;
response.size_copied = bytesCopied;
copyResponse.next(response);
});
this.node.mkdirp(this.node.path.dirname(targetPath), (err) => {
if (err) {
const response = new FileCopyResponseModel();
response.is_error = true;
response.error = err;
copyResponse.next(response);
} else {
const writeStream = this.node.fs.createWriteStream(targetPath);
writeStream.once("error", (err) => {
const response = new FileCopyResponseModel();
response.is_error = true;
response.error = err;
copyResponse.next(response);
});
writeStream.once("close", (ex) => {
const response = new FileCopyResponseModel();
response.is_error = false;
response.is_done = true;
response.size = fileSize;
copyResponse.next(response);
});
readStream.pipe(writeStream);
}
});
return copyResponse;
}
ファイルをコピーされます:これは、ファイルをコピーするために私の機能コードのですか?
data
イベントを聞いているときに、コピーの進行状況が正しく報告されています。
この場合、writeStreamをどのように閉じますか? –
私はどのように – willwoo
はい、これが問題を解決したかを示す答えを更新しました。ありがとう。 –