• Просьба не публиковать сообщения с предложениями продажи модов или сборок!

    Мы против использования и перепродажи слитых модов и переделок на их основе. Остальное также сложно верифицировать, поэтому в целом пока что запрещаем эту тему на сайте.

Работа с файлами (создание/запись/чтение/удаление)

Lev Angel

Developer
Команда форума
Скриптер
Сообщения
928
Для работы с файлами используется встроенный модуль fs. Ссылка на подробную документацию по этому модулю: File System

Чтобы использовать модуль подключаем его в начале скрипта
JavaScript:
var fs = require('fs');

Все операции с файлами можно делать синхронно и асинхронно. Синхронные операции всегда ждут когда действие с файлом выполнится и возвращают результат. При этом блокируется основной поток и весь сервер ждет. Асинхронные же операции не выполняются сразу после вызова. Результат работы становится известным позже, и для того, чтобы оповестить приложение о полученных значениях, асинхронная функция вызывает другую функцию (callback), которую мы передаем в аргументах при запуске.



Как прочитать содержимое файла?
Давайте для примера прочитаем что-то из файла.
JavaScript:
var fs = require('fs'); // подключаем модуль

// Асинхронное чтение
fs.readFile( __dirname + '/test.txt', function(err,data){
    console.log('async read: ' + data);
});

//Синхронное чтение
var data = fs.readFileSync(__dirname + '/test2.txt');
console.log('sync read: ' + data);
Предопределенная переменная __dirname содержить путь к папке в которой лежит данный скрипт.

Если указанный файл не найден, то при синхронном чтении будет выброшено исключение (Exception), а в асинхронном варианте ошибка прийдет в callback функцию в первом аргументе err.
JavaScript:
// Асинхронное чтение
fs.readFile( __dirname + '/notexist.txt', function(err,data){
    if(err){
        return console.log('async read error: ' + err); // async read error: Error: ENOENT: no such file or directory, open 'C:\RAGEMP\server-files\packages\fs-test\notexist.txt'
    }

    console.log('async read: ' + data);
});

//Синхронное чтение
try{
    var data = fs.readFileSync(__dirname + '/notexist.txt');
    console.log('sync read: ' + data);
}catch(e){
    console.error('sync read error: ' + e); // sync read error: Error: ENOENT: no such file or directory, open 'C:\RAGEMP\server-files\packages\fs-test/notexist.txt'
}




Как записать текст в файл?
Теперь запишем какой-нибудь текст в файл.
Примечание: здесь и далее будем пользоваться только асинхронными функциями, при необходимости их можно легко будет переделать под синхронные (как в примерах выше).
JavaScript:
fs.writeFile(__dirname + '/hello.txt', "Hello, world!", function(err){
    if(err)throw err;

    console.log('Текст записан в файл'); // выведем сообщение когда запись будет завершена
});
file-write.JPG

При каждом вызове этого кода файл будет перезаписываться. Если же мы хотим дописывать что-то в конец файла (например, для ведения логов), то нужно использовать fs.appendFile
JavaScript:
fs.appendFile(__dirname + '/hello.txt', '\r\nНовая строка текста', (err) => {
    if (err) throw err;

    console.log('Текст добавлен в файл');
});

В начале фрагмента текста который нужно записать в файл мы добавили символы \r\n - комбинация этих символов позволяет сделать перенос строка, чтобы наш текст добавился не в ту же строку, а с новой.
file-append.JPG



Как удалить файл?
Теперь удалим наш файл hello.txt
JavaScript:
fs.unlink(__dirname + '/hello.txt', (err) => {
    if (err) throw err;
    
    console.log('hello.txt был удален');
});

Обратите внимание что здесь и в примере выше в callback функцию передается только один аргумент err, который при наличии ошибок будет не пустой (что мы и проверяем и выбрасываем исключение).
 
Последнее редактирование:
Пример создания простого чат логгера. Он будет записывать все что напишут игроки в текстовый файлик.
Для реализации пригодится серверное событие playerChat

JavaScript:
var fs = require('fs');
const { EOL } = require('os');

mp.events.add("playerChat", (player, text) => {
    const entry = player.name + ': ' + text + EOL;

    fs.appendFile(__dirname + '/chatlog.txt', entry, (err) => {
        if (err) throw err;
    });
});
В данном примере EOL этот тот же перенос строки что и в уроке, но уже универсальный под любою операционную систему.
 
Назад
Верх