Попробуйте использовать node.js , fs.read

#javascript #node.js

#javascript #node.js

Вопрос:

Вот как я вызываю fs.read, но я постоянно получаю сообщение об ошибке. Что-то не так с моим синтаксисом?

Ошибка в командной строке: «ErrorCode»: -1,

         var fs = IMPORTS.require('fs'), 
    sys = IMPORTS.require("sys")    

    var file=   this.filename, 
    start=  parseInt(offsetStart),
    end=    parseInt(offsetEnd);
    bufSize = 64 * 1024;

     fs.open(file,'r',0666,function(err,fd) {
          fs.read(fd,bufSize,0,end,start,function(err,str,count) {
              result = {    reply:str,
                        reply2:count            
                };}); });
  

Ответ №1:

Это может помочь, если вы объясните, что вы здесь делаете. Почему вы открываете файл и что вы пытаетесь прочитать из него?

Если это текстовый файл, возможно, проще использовать поток чтения, что-то вроде этого:

 inp = fs.createReadStream('sample.txt');
inp.setEncoding('utf8');
inptext = '';
inp.on('data', function (data) {
    inptext  = data;
});
inp.on('end', function (close) {
    console.log(inptext);
});
  

Возможно, вам захочется взглянуть на свой код и спросить себя, куда деваются данные в вашем операторе return . Если вы действительно хотите использовать цепочку обратного вызова, вы можете попробовать передать пустой объект, а затем заполнить его данными, чтобы вам не приходилось беспокоиться об отправке данных обратно по цепочке обратного вызова.

Комментарии:

1. Привет, спасибо за ответ. Я считываю изображение (обложку альбома) из файла mp3. Поэтому я смещаю start и end, которые являются начальным и конечным местоположением img в двоичном файле. Размер очищенных данных может достигать 100 кб, и я использую кодировку base64.

2. Я попробовал fs.createReadStream, но независимо от того, какой начальный, конечный или буферный параметр я установил, он никогда не считывает данных объемом более 57 тыс. итак, я получаю частичное изображение.

Ответ №2:

если вы ожидаете до 100 кб, а буфер равен 64 кб, а изображение смещено, может ли это означать получение первых 57 КБ чего-то, начинающегося примерно с 7 кб?

Что произойдет, если размер буфера равен 256 * 1024?

Могут ли значения offsetStart и offsetEnd отображаться или сбрасываться? Кажется, их стоит знать.

Кроме того, действительно ли второе значение является смещением или это длина?

Комментарии:

1. Привет, Билл, второе значение действительно является length значением. Например, при чтении я получил следующие цифры: начало: 78889, конец: 138310.

2. Ах, и если бы вы думали, что это start и stop, вы бы получили ‘length’ = 60K … не правильный 138310! Что произойдет, если вы измените код, чтобы он соответствовал, и расширите буфер?

3. Я только что попробовал 256 * 1024, но по-прежнему отображается только треть изображения. Мне интересно, есть ли ошибка в этой версии node v0.2.3. которую я обязан использовать, поскольку она является частью api, встроенного в мобильную платформу, которую я разрабатываю для WebOS.

4. Хм, вот облом. Та же часть изображения, что и в 64 * 1024? 256 не имело никакого значения? Есть причины не пробовать 4086 * 1024? 16 * 1024? Просто чтобы посмотреть, есть ли какая-либо чувствительность. Как насчет простого 4194304? Если 4X с 64 по 256 ничего не изменили, вероятно, проблема не в этом буфере. Это всегда может быть ошибка в библиотеке. Можете ли вы предоставить ему файл изображения примерно того же размера, который он, по-видимому, читает? Я собираюсь поискать другие примеры fs.createReadStream … и .js больших файлов в целом.

5. Вы видели публикацию «Каковы плюсы и минусы fs.createReadStream против fs.ReadFile в node.js ?» Авторы согласны с тем, что fs.ReadFile загрузит весь файл в память целиком, в то время как as fs.createReadStream будет считывать файл частями указанного вами размера.