Natknąłem się na tę stronę, próbując rozwiązać problem w NodeJS: ponowny montaż fragmentów plików. Zasadniczo: mam tablicę nazw plików. Muszę dołączyć wszystkie te pliki we właściwej kolejności, aby utworzyć jeden duży plik. Muszę to zrobić asynchronicznie.
Moduł 'fs' węzła zapewnia appendFileSync, ale nie chciałem blokować serwera podczas tej operacji. Chciałem użyć modułu fs.promises i znaleźć sposób na połączenie tych rzeczy razem. Przykłady na tej stronie nie do końca działały dla mnie, ponieważ faktycznie potrzebowałem dwóch operacji: fsPromises.read () do wczytania fragmentu pliku i fsPromises.appendFile () do połączenia z plikiem docelowym. Może gdybym był lepszy z javascriptem, mógłbym sprawić, że poprzednie odpowiedzi działałyby dla mnie. ;-)
Natknąłem się na to ...
https://css-tricks.com/why-using-reduce-to-sequably-resolve-promises-works/
... i udało mi się zhakować razem działające rozwiązanie.
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());
};
A oto test jednostkowy jaśminu:
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 {
}
});
});
Mam nadzieję, że to komuś pomoże.