NodeJS'de bir sorunu çözmeye çalışırken bu sayfada karşılaştım: dosya parçalarının yeniden birleştirilmesi. Temel olarak: Bir dizi dosya ismim var. Tek bir büyük dosya oluşturmak için tüm bu dosyaları doğru sırada eklemem gerekiyor. Bunu eşzamansız olarak yapmalıyım.
Düğüm 'fs' modülü appendFileSync sağlar, ancak bu işlem sırasında sunucuyu engellemek istemiyordu. Ben fs.promises modülünü kullanmak ve bunları birbirine zincirlemek için bir yol bulmak istedim. Aslında iki işleme ihtiyacım olduğu için bu sayfadaki örnekler benim için pek işe yaramadı: chs dosyasında okumak için fsPromises.read () ve hedef dosyaya uyum sağlamak için fsPromises.appendFile (). Belki javascript ile daha iyi olsaydı önceki cevapları benim için işe yarayabilir. ;-)
Ben bununla karşılaştım ...
https://css-tricks.com/why-using-reduce-to-sequentially-resolve-promises-works/
... ve çalışan bir çözümü hackleyebildim.
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());
};
Ve işte bir yasemin birimi testi:
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 {
}
});
});
Umarım birine yardımcı olur.