我想要做的是读取文件,然后在编写文件时能够使用该信息执行其他操作。例如:
读取文件 写文件,同时执行MD5哈希,数字签名等。
我可以使用fs.readfile和fs.writefile作为一个操作,只是将文件从Web服务器复制到我的计算机,但我不认为我仍然可以执行这些操作。无论如何,跳过之间的东西。如何使用fs.readfile和writefile创建两个单独的函数来复制文件?这是我一直在努力的,是的,我已经广泛阅读这些论坛以寻找答案。
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');
我希望能够下载任何类型的文件,只需制作原始副本,并将md5哈希等附加到JSON文件中。这可能是后来的问题。
答案 0 :(得分:23)
正如dandavis在评论中所建议的,readFile
什么都不做,因为它是异步调用。查看this answer以获取有关其含义的其他信息。
简而言之,异步调用永远不会等待结果返回。在您的示例中,getData
不会等待readFile()
返回您想要的结果,但会立即完成。异步调用通常通过传递callbacks
来处理,readFile
是writeFile
和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');
});
});
}
的最后一个参数。
无论如何,有两种方法可以做到这一点:
1.异步(这是正确的方式):
readFile
2.同步。您的代码不会有太大变化,您只需要分别用writeFile
和readFileSync
替换writeFileSync
和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');
});
});
}
。 警告:使用此方法不仅违反了最佳做法,而且违背了使用nodejs的目的(除非您有非常合理的理由)。
修改:根据OP的请求,这里有一种可能的方法来分隔这两种方法,例如使用回调:
getFileContent
这样,您将读取的部分(在{{1}}中)与复制部分分开。
答案 1 :(得分:4)
我最近不得不使用这个,所以我将verybadallocs的答案转换为承诺。
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();
}
});
})
}
然后使用它们很简单。
readFile("path").then(function(results){
results+=" test manipulation";
return writeFile("path",results);
}).then(function(){
//done writing file, can do other things
})
答案 2 :(得分:0)
要以非阻塞或异步方式读写文件,可以使用es6或更高版本的高级功能(例如Promise或Async / await),但必须注意 Polyfills ({ {3}}),或者如果只有几个读/写,则可以使用回调地狱。
function readFiles(){
fs.readFile('./txt/start.txt', 'utf-8', (err, data1)=>{
if(err) return console.log(err);
fs.readFile(`./txt/${data1}.txt`, 'utf-8', (err, data2)=>{
if(err) return console.log(err);
fs.readFile('./txt/append.txt', 'utf-8', (err, data3)=>{
if(err) return console.log(err);
writeFile('./txt/final.txt', `${data2}\n${data3}`);
});
});
});
}
function writeFile(path, data){
fs.writeFile(path,data,'utf-8',err=>{
if(err){
console.log(err);
}
})
}
readFiles();