it-swarm.com.de

node.js fs.read () Beispiel

app=function(req,res)
{
 res.writeHead(200,{'Content-Type':'text/plain'})
 var buffer=new Buffer(100)
 var fs=require('fs')
 fs.open('.'+req.url,'r',function(err,fd){
  fs.fstat(fd,function(err, stats){
   var i=0
   var s=stats.size
   console.log('.'+req.url+' '+s)
   for(i=0;i<s;console.log(i)){
    i=i+buffer.length
    fs.read(fd,buffer,0,buffer.length,i,function(e,l,b){
     res.write(b.toString('utf8',0,l))
     console.log(b.toString('utf8',0,l))
    })
   }
   res.end()
   fs.close(fd)
  })
 })
}
http = require('http')
server = http.createServer(app)
server.listen(8000,"127.0.0.1")
console.log('GET http://127.0.0.1:8000/appwsgi/www/index.htm')

Warum werden nur die letzten 100 Byte mehrmals aus einer 979-Byte-Datei angezeigt?

Warum zeigt der Chrome-Browser keine Ausgabe an?

[email protected]:~/http$ node server.js 
GET http://127.0.0.1:8000/appwsgi/www/index.htm
./appwsgi/www/index.htm 979
100
200
300
400
500
600
700
800
900
1000
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>

oad.<br/>
   <a href=
"vi/vi.htm">vi</a> Edit online files on the server.
  </div>
 </body>
</html>
15
Gert Cuykens

Alle Lesevorgänge werden asynchron unter Verwendung desselben Puffers ausgegeben (d. H. Fs.read wird sofort zurückgegeben und die Schleife wird fortgesetzt). Zu dem Zeitpunkt, zu dem der async-Callback zum ersten Mal aufgerufen wird, sind anscheinend alle zehn Lesevorgänge abgeschlossen (der Puffer enthält also die Ergebnisse des letzten Lesevorgangs). Da Sie fs.read 10 mal angerufen haben, werden Sie 10 mal zurückgerufen. Also bekommst du was du siehst.

Der Browser zeigt nichts an, da Sie die Antwort beendet haben, bevor der erste Rückruf zurückgegeben wird.

8
Geoff Chappell

Ich weiß, dass diese Frage nicht die neueste ist, aber ich werde dies hier aufgreifen, denn als ich Probleme hatte, ein Dateisystemobjekt zu öffnen (und zu lesen), schien eine schnelle Suche mich immer hierher zu führen.

Auf jeden Fall sollte dies beim OP und anderen in der Zukunft helfen.

(Dateipfad ist der tatsächliche Dateiname einschließlich Pfad)

fs.open(filepath, 'r', function(err, fd) {
    fs.fstat(fd, function(err, stats) {
        var bufferSize=stats.size,
            chunkSize=512,
            buffer=new Buffer(bufferSize),
            bytesRead = 0;

        while (bytesRead < bufferSize) {
            if ((bytesRead + chunkSize) > bufferSize) {
                chunkSize = (bufferSize - bytesRead);
            }
            fs.read(fd, buffer, bytesRead, chunkSize, bytesRead);
            bytesRead += chunkSize;
        }
        console.log(buffer.toString('utf8', 0, bufferSize));
        fs.close(fd);
    });
});
17
Joshua Davison

Ich habe das Beispiel @ user1256169 von oben verwendet, um das zu erstellen, was ich brauchte. Hier verwende ich async.whilst , um den asynchronen Steuerungsfluss sauberer zu behandeln. Am Anfang des Beispiels lese ich die Datei und ihre Werte synchron , aber das kann geändert werden, wenn dies erforderlich ist.

var fs = require('fs');
var async = require('async');

var fd = fs.openSync('/path/to/cat.png', 'r');
var stats = fs.fstatSync(fd);


var bufferSize = stats.size,
    chunkSize = 512,//bytes
    buffer = new Buffer(bufferSize),
    bytesRead = 0;

async.whilst(
    function () {
        return bytesRead < bufferSize;
    },
    function (done) {
        if ((bytesRead + chunkSize) > bufferSize) {
            chunkSize = (bufferSize - bytesRead);
        }
        // fd, buffer, offset, length, position, callback
        fs.read(fd, buffer, bytesRead, chunkSize, bytesRead,
        function (err, bytes, buff) {
            if (err) return done(err);
            var buffRead = buff.slice(bytesRead, bytesRead+chunkSize);
            // do something with buffRead
            bytesRead += chunkSize;
            done();
        });
    },
    function (err) {
        if (err) console.log(err);
        fs.close(fd);
    }
);
1
simo

Da Sie Ihre App so konzipiert haben, dass sie Dateien nacheinander (synchron) verarbeitet, müssen Sie fs.readSync () verwenden. Beachten Sie jedoch, dass Ihre App eine Datei auf diese Weise liest, jedoch nichts anderes tun kann.

Ein besserer Ansatz wäre die Verarbeitung der Dateien auf die "Knotenweise", dh asynchron.

- node.fs - eine Zeile, kein Warten

0
Rob Raisch