Как добавить строку к определенному блоку в файле с помощью fs
Мне нужно добавить строку в блок внутри файла с помощью fs. У меня есть файл с блоком:
dependencies {
...
}
Я хотел бы добавить строку в этот блок с помощью fs, чтобы он печатал:
dependencies {
...
implementation files("../../node_modules/react-native-star-io10/android/src/lib/stario10.aar")
}
Итак, я знаю, что мне нужно сделать что-то вроде этого:
fs.appendFile(fileToAppend, 'implementation files("../../node_modules/react-native-star-io10/android/src/lib/stario10.aar")', (err) => {
if (err) {
console.log(err);
}
});
Но это добавит в конец файла. Как я могу добавить в конецdependencies
блокировать?
1 ответ
Вы можете добавить только в конец файла. Вы не можете вставить новые данные в середину файла.
Если файл невелик, то вы, как правило, читаете его целиком в память, вставляете свои данные в нужное место в памяти, а затем записываете все это снова.
Если файл JSON, то вы можете прочитать все это в память, проанализировать его в объект Javascript, затем добавить элементы, которые вы хотите, к соответствующим свойствам/объектам в объекте Javascript, затем преобразовать обратно в JSON и записать все это обратно вне. Если ваши данные представлены в формате JSON, в качестве анализатора используется анализатор JSON, что избавляет вас от необходимости писать код для анализа.
Если файл большой, вы можете передавать его построчно, анализируя по мере продвижения. По ходу вы записываете прочитанные данные в новый файл. Когда вы найдете место, куда вы хотите вставить данные, вы записываете эти новые данные (в новый файл) в нужном месте, а затем продолжаете чтение остальной части файла, записывая их по ходу дела. Когда все будет готово, вы можете удалить исходный файл и переименовать новый файл обратно в желаемое имя. Хотя это по-прежнему включает в себя чтение и перезапись всего файла, это можно сделать по несколько строк за раз, чтобы вы могли обрабатывать огромные файлы любого размера, не используя много памяти.
Вот пример чтения файла в память, выполнения замены в памяти для добавления новых данных и последующей записи обратно:
const fs = require('fs');
async function insertFileData(filename, regEx, dataToInsert) {
const data = await fs.promises.readFile(filename, 'utf8');
const newData = data.replace(regEx, "$&" + dataToInsert);
return fs.promises.writeFile(filename, newData);
}
insertFileData("temp.txt", /[\n^]\s+dependencies\s+{\s*\n/, " Additional data\n More data\n").then(() => {
console.log("Finished successfully");
}).catch(err => {
console.log(err);
});