2013-07-15 6 views
15

Was ich tun möchte, ist eine Datei lesen und dann in der Lage sein, andere Operationen mit dieser Information auszuführen, während ich die Datei schreibe. Zum Beispiel:Node.js wie liest man eine Datei und schreibt dann dieselbe Datei mit zwei separaten Funktionen?

Lesedatei Write-Datei und zur gleichen Zeit MD5-Hash, digitale Signatur usw.

durchführen konnte ich fs.readfile und fs.writefile als eine Operation verwenden und kopieren Sie einfach die Datei aus dem Internet Server zu meinem Computer, aber ich glaube nicht, dass ich immer noch dieselben Operationen ausführen könnte. Wie auch immer, das Zwischendurch-Zeug auslassen. Wie verwende ich fs.readfile und writefile, um zwei separate Funktionen zum Kopieren einer Datei zu erstellen? Hier ist, woran ich gearbeitet habe, und ja, ich habe diese Foren ausführlich auf der Suche nach einer Antwort gelesen.

var fs = require('fs'); 



function getData(srcPath) { 
fs.readFile(srcPath, 'utf8', function (err, data) { 
     if (err) throw err; 
     return data; 
     } 
    ); 
} 


function writeData(savPath, srcPath) { 
     fs.writeFile (savPath, (getData(srcPath)), function(err) { 
     if (err) throw err; 
      console.log('complete'); 
     } 
    ); 
} 
//getData ('./test/test.txt'); 
writeData ('./test/test1.txt','./test/test.txt'); 

Ich möchte in der Lage sein, Dateien aller Art herunterzuladen und nur rohe Kopien zu machen, mit MD5-Hash usw. auf eine JSON-Datei angehängt. Das wird wahrscheinlich später eine Frage sein.

+0

getData tut nichts in Ihrem Code. Sie müssen writeFile im Callback von readFile aufrufen. Wenn Sie git-r-dun haben wollen, gibt es immer fs.readFileSync(), was so funktioniert, wie Sie es wahrscheinlich erwarten. – dandavis

Antwort

17

Wie von dandavis in seinem Kommentar vorgeschlagen, tut readFile nichts, weil es ein asynchroner Aufruf ist. Weitere Informationen dazu finden Sie unter this answer.

Kurz gesagt, ein asynchroner Aufruf wird nie auf die Rückkehr des Ergebnisses warten. In Ihrem Beispiel wartet getData nicht auf readFile(), um das gewünschte Ergebnis zurückzugeben, sondern wird sofort beendet. Async-Aufrufe werden normalerweise behandelt, indem callbacks übergeben wird, der der letzte Parameter zu readFile und writeFile ist.

In jedem Fall gibt es zwei Möglichkeiten, dies zu tun:

1.Do es asynchron (was den richtigen Weg ist):

function copyData(savPath, srcPath) { 
    fs.readFile(srcPath, 'utf8', function (err, data) { 
      if (err) throw err; 
      //Do your processing, MD5, send a satellite to the moon, etc. 
      fs.writeFile (savPath, data, function(err) { 
       if (err) throw err; 
       console.log('complete'); 
      }); 
     }); 
} 

2.Do es synchron. Ihr Code muss sich nicht viel ändern, Sie müssen lediglich readFile und writeFile durch readFileSync bzw. writeFileSync ersetzen. Warnung: die Verwendung dieser Methode ist nicht nur gegen die Best Practices, sondern widerspricht dem eigentlichen Zweck der Verwendung von nodejs (es sei denn natürlich, Sie haben einen sehr legitimen Grund).

bearbeiten: Wie pro Anforderung des OP, hier ist eine Möglichkeit, die beiden Methoden zu trennen, zB mit Rückrufe:

function getFileContent(srcPath, callback) { 
    fs.readFile(srcPath, 'utf8', function (err, data) { 
     if (err) throw err; 
     callback(data); 
     } 
    ); 
} 

function copyFileContent(savPath, srcPath) { 
    getFileContent(srcPath, function(data) { 
     fs.writeFile (savPath, data, function(err) { 
      if (err) throw err; 
      console.log('complete'); 
     }); 
    }); 
} 

diese Weise werden Sie den Leseteil zu trennen (in getFileContent) von der Kopierteil.

+0

Von dem, was Sie sagten, wäre es eine frivole Zeitverschwendung, dies synchron zu tun. Ich dachte nur, dass es einfacher wäre, readfile abzusetzen und writeful als separate Funktionen für den Fall, dass ich jemals nur eine und nicht die andere innerhalb des Programms verwenden müsste.Wenn ich jedoch die gesamte Verarbeitung richtig mache, funktioniert das besser. Ich muss es einfach ausprobieren und sehen, ob es funktioniert. –

+0

Schauen Sie sich meine Bearbeitung an, um das Lesen vom Kopieren zu trennen. Sie können die gleiche Technik auf writeFile anwenden (z. B. einen Callback übergeben). – verybadalloc

0

Ich musste dies vor kurzem verwenden, so konvertierte ich sehrbadallocs Antwort auf Versprechen.

function readFile(srcPath) { 
    return new Promise(function (resolve, reject) { 
     fs.readFile(srcPath, 'utf8', function (err, data) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(data); 
      } 
     }); 
    }) 
} 

function writeFile(savPath, data) { 
    return new Promise(function (resolve, reject) { 
     fs.writeFile(savPath, data, function (err) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(); 
      } 
     }); 
    }) 
} 

Dann ist die Verwendung von ihnen einfach.

readFile("path").then(function(results){ 
    results+=" test manipulation"; 
    return writeFile("path",results); 
}).then(function(){ 
    //done writing file, can do other things 
}) 
Verwandte Themen