Могу ли я использовать writeStream.bytesWritten с pipe? - PullRequest
0 голосов
/ 22 мая 2018

Я хочу иметь возможность отслеживать скорость копирования с помощью методов 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 Ответ

0 голосов
/ 22 мая 2018

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

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);

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

...