Saya sengaja menemukan halaman ini ketika mencoba untuk memecahkan masalah di NodeJS: reassembly potongan file. Pada dasarnya: Saya memiliki berbagai nama file. Saya perlu menambahkan semua file itu, dalam urutan yang benar, untuk membuat satu file besar. Saya harus melakukan ini secara tidak sinkron.
Modul 'fs' Node memang menyediakan appendFileSync tapi saya tidak ingin memblokir server selama operasi ini. Saya ingin menggunakan modul fs.promises dan menemukan cara untuk menyatukan semua ini. Contoh-contoh pada halaman ini tidak cukup berhasil bagi saya karena saya benar-benar membutuhkan dua operasi: fsPromises.read () untuk membaca file chunk, dan fsPromises.appendFile () untuk menyesuaikan dengan file tujuan. Mungkin jika saya lebih baik dengan javascript saya bisa membuat jawaban sebelumnya berfungsi untuk saya. ;-)
Saya sengaja menemukan ini ... https://css-tricks.com/why-using-reduce-to- berikutnyaally- resolve-promises-
works/
... dan saya dapat meretas bersama solusi yang berfungsi.
TLDR:
/**
* sequentially append a list of files into a specified destination file
*/
exports.append_files = function (destinationFile, arrayOfFilenames) {
return arrayOfFilenames.reduce((previousPromise, currentFile) => {
return previousPromise.then(() => {
return fsPromises.readFile(currentFile).then(fileContents => {
return fsPromises.appendFile(destinationFile, fileContents);
});
});
}, Promise.resolve());
};
Dan inilah tes unit melati untuknya:
const fsPromises = require('fs').promises;
const fsUtils = require( ... );
const TEMPDIR = 'temp';
describe("test append_files", function() {
it('append_files should work', async function(done) {
try {
// setup: create some files
await fsPromises.mkdir(TEMPDIR);
await fsPromises.writeFile(path.join(TEMPDIR, '1'), 'one');
await fsPromises.writeFile(path.join(TEMPDIR, '2'), 'two');
await fsPromises.writeFile(path.join(TEMPDIR, '3'), 'three');
await fsPromises.writeFile(path.join(TEMPDIR, '4'), 'four');
await fsPromises.writeFile(path.join(TEMPDIR, '5'), 'five');
const filenameArray = [];
for (var i=1; i < 6; i++) {
filenameArray.push(path.join(TEMPDIR, i.toString()));
}
const DESTFILE = path.join(TEMPDIR, 'final');
await fsUtils.append_files(DESTFILE, filenameArray);
// confirm "final" file exists
const fsStat = await fsPromises.stat(DESTFILE);
expect(fsStat.isFile()).toBeTruthy();
// confirm content of the "final" file
const expectedContent = new Buffer('onetwothreefourfive', 'utf8');
var fileContents = await fsPromises.readFile(DESTFILE);
expect(fileContents).toEqual(expectedContent);
done();
}
catch (err) {
fail(err);
}
finally {
}
});
});
Saya harap ini membantu seseorang.