#node.js #error-handling #stream
#node.js #обработка ошибок #поток
Вопрос:
Я реализовал чтение файлов с большим текстом, используя createReadStream
. В моей реализации я хотел проверить обработку ошибок.
Итак, я запустил процесс и переименовал файл, все равно весь файл был прочитан, и все данные были напечатаны на консоли. Со второй попытки я сделал то же самое, но на этот раз я удалил файл, и результаты были такими же, весь файл был прочитан и распечатан на консоли.
Короче говоря, я читаю файл с помощью createReadStream
, и после начала чтения, даже если я переименую / удалю файл, он все равно читается до конца.
Вот пример реализации,
const fs = require('fs');
const readableStream = fs.createReadStream('mySampleTextFile.txt');
readableStream.on('data', (chunk) => console.log(chunk));
readableStream.on('end', () => console.log('Read till end !'));
mySampleTextFile.txt
содержит 600 тыс. строк с одним номером в каждой строке, и я проверил, что последний зарегистрированный номер точно такой же, как в исходном файле.
Я удаляю файл до завершения выполнения, у меня открыты два терминала, и в одном я запускаю выполнение, а во втором запускаю команду удаления / переименования.
Я попытался также удалить навсегда, что означает прямое удаление, а не в корзину.
Я пропускаю какой-то фундаментальный поток или что-то в этом роде? Пожалуйста, помогите мне в этом, это ничего не нарушает, но почему это не нарушает?
Ответ №1:
По крайней мере, в ОС типа Unix, когда вы удаляете файл, пока он открыт, процесс, открывший файл, все еще может читать из него (или записывать в него).
Удаление такого файла просто удаляет его запись в каталоге, поэтому вы больше не можете видеть его при запуске ls
или в браузере файлов, но занимаемое им дисковое пространство не будет помечено как «доступное», пока больше не будет процессов, ссылающихся на файл (т. Е. Не Откроет его).
Что вы могли бы попробовать, так это обрезать файл вместо его удаления:
cp /dev/null mySampleTextFile.txt
Комментарии:
1. Я использую Mac, значит, на базе Unix, так что, должно быть, это причина. Попробую и дам вам знать. Спасибо за быстрый ответ.
2. Я пробовал, пока он не выдает ошибку, но завершает чтение. Это очевидно, поскольку мы усекаем файл, это означает, что поток не получает больше данных из файла, следовательно, конец.
3. @ErrHunter Я надеялся, что усечение испортит указатель на файл и, таким образом, выдаст ошибку 🙁
4. Ошибок нет
:/
. Я понял, в чем дело, так что спасибо!5. Попробуйте изменить разрешения, чтобы он стал нечитаемым для вашего uid (хотя, опять же, я не уверен, что это действительно что-то сделает, когда файл уже был открыт вашим процессом).