Могу ли я использовать writeStream.bytesWritten с трубкой?

Gaspacchio спросил: 28 апреля 2018 в 09:31 в: javascript

Я хочу отслеживать скорость копирования с использованием методов node.js и pipe, чтобы я мог отображать индикатор выполнения, индикатор скорости и, в конечном счете, оценку времени.

На данный момент, просматривая некоторые ссылки, я полагаю, что мне придется играть с writeStream.bytesWritten, но я не уверен, как правильно его использовать: работает ли это с pipe? Или мне нужно использовать writeableStream.write();?


В некотором контексте:

Как мне нужно скопировать несколько файлов, я использую цикл do ... while и увеличиваю счетчик каждый раз при запуске копии. Он работает нормально, но я не могу использовать writeStream.bytesWritten для отслеживания скорости передачи.

Ниже приведен код, который я использую в настоящее время, console.log(firstCopy.bytesWritten); возвращает 0 дважды:

//Launch copy process
do {
  let readableStream = fs.createReadStream(fileList[i]);//This is the source file
  let firstCopy = fs.createWriteStream(path.join(copyPathOne, fileName[i])),
    secondCopy = fs.createWriteStream(path.join(copyPathTwo, fileName[i]));//These are the targets  readableStream.pipe(firstCopy);//We launch the first copy
  readableStream.pipe(secondCopy);//And the second copy
  console.log(firstCopy.bytesWritten);//Here we monitor the amount of bytes written
  ++i;//Then we increment the counter} while (i < fileList.length);//And we repeat the process while the counter is < to the number of files

Я также пробовал:

console.log(writeStream.bytesWritten(firstCopy));//Error: writeStream is not defined

Почему вы используете do ... while, а не forEach?

Я выполняю итерацию через массив. Я мог бы использовать forEach, но, поскольку я не понимаю, как это работает, я предпочитаю использовать do ... while. Кроме того, я думал, что это будет простой способ скопировать каждый файл и что он будет ждать конца копии (pipe), как сказано здесь:

Выражение, оцениваемое после каждого прохождения цикла. Если условие оценивается как true, инструкция повторно выполняется.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/do...while


1 ответ

Есть решение
Aramil Rey ответил: 28 апреля 2018 в 11:50

Я думаю, что вы пытаетесь сделать что-то вроде этого:

const wstream = fs.createWriteStream('myFileToWriteTo'); 
const rstream = fs.createReadStream('myFileToReadFrom'); // Every time readstream reads (Listen to stream events)
rstream.on('data', function (chunk) {
  // Advance your progress by chunk.length
  // progress += chunk.length 
});rstream.on('end', function () {  // done
  // You finished reading rstream into wstream
});rstream.pipe(wstream);

Имейте в виду, что это асинхронный (неблокирующий), поэтому, если вы создаете цикл обратных потоков, вы будете пытаться читать / записывать все ваши файлы одновременно

Gaspacchio ответил: 28 апреля 2018 в 11:55
Спасибо, я застрял, потому что думал, что чтение не может быть сделано с той же скоростью, что и запись, но поскольку труба управляет потоком, это может быть достаточно точным. Я даю ему попробовать прямо сейчас!
Gaspacchio ответил: 28 апреля 2018 в 12:04
Спасибо ! Я могу отредактировать ваш ответ, чтобы добавить более подробную информацию о том, как получить общий размер файла и отобразить процентное количество копий, если с ним все в порядке :)
Aramil Rey ответил: 28 апреля 2018 в 12:13
Да, конечно, не стесняйтесь добавлять какие-либо релевантные детали! Я думал о добавлении fs.statSync() для вычисления прогресса для этого примера с одним файлом, но решил оставить его вам.