我一直在尝试在使用Node.js时写入文件,但没有成功。我该怎么做?
当前回答
目前有三种方法可以写入文件:
fs.write(fd,缓冲区,偏移量,长度,位置,回调)您需要等待回调,以确保缓冲区已写入磁盘。它没有缓冲。fs.writeFile(文件名,数据,[编码],回调)所有数据必须同时存储;不能执行顺序写入。fs.createWriteStream(路径,[options])创建WriteStream,这很方便,因为您不需要等待回调。但同样,它没有缓冲。
顾名思义,WriteStream就是一个流。根据定义,流是包含沿一个方向移动的数据的“缓冲区”(源► 目的地)。但可写流不一定是“缓冲”的。当您写n次时,流被“缓冲”,在时间n+1,流将缓冲区发送到内核(因为它已满,需要刷新)。
换句话说:“缓冲区”就是对象。它是否“被缓冲”是该对象的一个属性。
如果查看代码,WriteStream继承自可写的Stream对象。如果你注意,你会看到他们是如何刷新内容的;他们没有任何缓冲系统。
如果你写一个字符串,它会被转换成一个缓冲区,然后被发送到原生层并写入磁盘。在编写字符串时,它们不会填充任何缓冲区。因此,如果您这样做:
write("a")
write("b")
write("c")
你在做:
fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))
这是对I/O层的三次调用。虽然您使用的是“缓冲区”,但数据没有缓冲。缓冲流将执行:fs.write(new Buffer(“abc”)),一次对I/O层的调用。
截至目前,Node.js v0.12(2015年6月2日发布的稳定版本)现在支持两个功能:软木塞()和解开()。似乎这些函数最终将允许您缓冲/刷新写调用。
例如,在Java中,有一些类提供缓冲流(BufferedOutputStream、BufferedWriter…)。如果您写入三个字节,这些字节将存储在缓冲区(内存)中,而不是仅为三个字节执行I/O调用。当缓冲区已满时,内容将被刷新并保存到磁盘。这提高了性能。
我没有发现任何东西,只是记得应该如何进行磁盘访问。
其他回答
您可以使用库简易文件管理器
首先从npm安装npm安装简易文件管理器
上载和删除文件的示例
var filemanager = require('easy-file-manager')
var path = "/public"
var filename = "test.jpg"
var data; // buffered image
filemanager.upload(path,filename,data,function(err){
if (err) console.log(err);
});
filemanager.remove(path,"aa,filename,function(isSuccess){
if (err) console.log(err);
});
我喜欢的索引/文章/文件系统。
这对我有用。
另请参阅如何在node.js中写入文件?。
fs = require('fs');
fs.writeFile('helloworld.txt', 'Hello World!', function (err) {
if (err)
return console.log(err);
console.log('Wrote Hello World in file helloworld.txt, just check it');
});
helloworld.txt的内容:
Hello World!
更新:就像在当前目录中写入Linux节点一样,在其他一些目录中似乎没有,所以我添加了这条注释,以防万一:使用此ROOT_APP_PATH=fs.realpathSync('.');console.log(ROOT_APP_PATH);以获取文件的写入位置。
您可以使用fs(文件系统)模块写入文件。
以下是您可以如何做到的示例:
const fs = require('fs');
const writeToFile = (fileName, callback) => {
fs.open(fileName, 'wx', (error, fileDescriptor) => {
if (!error && fileDescriptor) {
// Do something with the file here ...
fs.writeFile(fileDescriptor, newData, (error) => {
if (!error) {
fs.close(fileDescriptor, (error) => {
if (!error) {
callback(false);
} else {
callback('Error closing the file');
}
});
} else {
callback('Error writing to new file');
}
});
} else {
callback('Could not create new file, it may already exists');
}
});
};
您可能还希望通过使用Promise和async/await语句来消除回调代码结构中的回调。这将使异步代码结构更加平坦。为此,可以使用一个方便的util.provify(原始)函数。它使我们能够从回调转向承诺。看看下面的fs函数示例:
// Dependencies.
const util = require('util');
const fs = require('fs');
// Promisify "error-back" functions.
const fsOpen = util.promisify(fs.open);
const fsWrite = util.promisify(fs.writeFile);
const fsClose = util.promisify(fs.close);
// Now we may create 'async' function with 'await's.
async function doSomethingWithFile(fileName) {
const fileDescriptor = await fsOpen(fileName, 'wx');
// Do something with the file here...
await fsWrite(fileDescriptor, newData);
await fsClose(fileDescriptor);
}
var path = 'public/uploads/file.txt',
buffer = new Buffer("some content\n");
fs.open(path, 'w', function(err, fd) {
if (err) {
throw 'error opening file: ' + err;
}
fs.write(fd, buffer, 0, buffer.length, null, function(err) {
if (err) throw 'error writing file: ' + err;
fs.close(fd, function() {
console.log('file written');
})
});
});
在这里,我们使用w+来读取/写入这两个操作,如果找不到文件路径,那么它将自动创建。
fs.open(path, 'w+', function(err, data) {
if (err) {
console.log("ERROR !! " + err);
} else {
fs.write(data, 'content', 0, 'content length', null, function(err) {
if (err)
console.log("ERROR !! " + err);
fs.close(data, function() {
console.log('written success');
})
});
}
});
内容是指您必须写入文件的内容及其长度“Content.length”。
推荐文章
- Node.js同步执行系统命令
- 如何转义JSON字符串包含换行字符使用JavaScript?
- jQuery等价于JavaScript的addEventListener方法
- jQuery需要避免的陷阱
- JavaScript中变量字符串的XML解析
- 'React'指的是一个UMD全局,但当前文件是一个模块
- 为什么useState不触发重新渲染?
- 如何使用回调与useState挂钩在反应
- 网络请求失败
- 如何使用JavaScript大写字符串中每个单词的第一个字母?
- 如何使用箭头函数(公共类字段)作为类方法?
- 使用Javascript的atob解码base64不能正确解码utf-8字符串
- 禁用包的postinstall脚本
- 如何阻止恶意代码欺骗“Origin”报头来利用CORS?
- Angular JS:当我们已经有了具有作用域的指令控制器时,指令的link函数还需要什么?