我如何获得的参数fs.read,fs.stat...方法从回调中?
例如,如果我想基于其大小的下载(coffeeScript)代码片段来处理文件
#assuming test1.txt exists
filename = "./test1.txt"
fs.stat filename, (err, stats) ->
data = filename:filename,size:stats.size
console.log data
#further process filename based on size
filename = "./test2.txt"
Run Code Online (Sandbox Code Playgroud)
版画
{ filename: './test2.txt', size: 5 }
Run Code Online (Sandbox Code Playgroud)
因为filename设置为"./test2.txt".如果我在fs.stat回调中使用filename变量处理/读取文件, 那么它将使用test2.txt哪个不是预期的.
我希望在回调中看到的是
{ filename: './test1.txt', size: 5 }
Run Code Online (Sandbox Code Playgroud) 我是nodeJS和MongoDB的新手.我有这个代码:
var fs = require('fs');
var mongojs = require('mongojs');
var db = mongojs('monitor', ["configurations"]);
fs.readFile('json/object1.json', 'utf8', function (err, data) {
if (err) throw err;
console.log(data);
db.configurations.insert(data, function(err, doc) {
console.log(data);
if(err) throw err;
});
});
Run Code Online (Sandbox Code Playgroud)
没有数据插入mongodb,我没有错误.两个console.log(data)也打印json字符串.
我正在尝试使用代码来读取数组并使用名称作为参数之一创建文件夹(如果该名称不存在).我一直在用fs做一个简单的循环,就像这样
var streamsRepository = streamsRepositoryFactory(__dirname + '/streams.json');
var obj = streamsRepository.streams[i];
var i;
for(i = 0; i < streamsRepository.streams.length; i++) {
var obj = streamsRepository.streams[i];
console.log('Folder '+obj.key+' is Created');
if (!fs.existsSync('../audio/'+obj.key)){
fs.mkdirSync('../audio/'+obj.key);
}
}
Run Code Online (Sandbox Code Playgroud)
但每次我不断收到消息.
Folder AAAA is Created
fs.js:796
return binding.mkdir(pathModule._makeLong(path),
^
Error: ENOENT: no such file or directory, mkdir '../audio/AAAA'
Run Code Online (Sandbox Code Playgroud) 我在node.js文件系统中遇到了问题.这是我的代码.我的函数总是返回一个空字符串.我想知道是否有任何方法使我的函数停止执行,直到readFile方法完成.
var fs = require('fs');
function myfun(filePath){
var str = '';
fs.readFile(filePath, function(err, data){
if(err) throw err;
str = data;
});
return str; //here, the variable str always return '' because the function doesn't wait for the readFile method complete.
}
Run Code Online (Sandbox Code Playgroud)
添加说明
实际上我正在做这样的事情:函数myfun用于替换str你可以看到我的代码:
function fillContent(content) {
var rex = /\<include.*?filename\s*=\s*"(.+?)"\/>/g;
var replaced = fileStr.replace(rex, function (match, p1) {
var filePath = p1
var fileContent = '';
fs.readFile(filePath, function (err, data) {
if (err) {
throw err;
}
fileContent = data; …Run Code Online (Sandbox Code Playgroud) 关于fs / io操作,NodeJs很棒,但是我不能用来访问共享的(用于存储)本地网络驱动器。
filesystem.writeFile('\\192.168.1.1\test.txt', 'data!', function(error){ ... });
Run Code Online (Sandbox Code Playgroud)
我收到UNKNOWN_ERROR,这无济于事!通过浏览器(我在Windows上)可以毫无问题地访问那里的IP,并且可以写(对于我的windnows用户)。
这里有什么问题 ?!
目前我正在fs.createWriteStream(filePath)做两件事:
但是,我从来没有真正写过流,所以我并没有真正使用它.我想知道这是多么犹豫,如果我不应该使用更有效或更明确的方法创建文件,如果它不存在并清除文件.有任何想法吗?
我有这样一个函数,它创建一个写流,然后将字符串数组写入文件.写完后,我想让它返回一个Promise.但我不知道如何才能做到这一点.
function writeToFile(filePath: string, arr: string[]): Promise<boolean> {
const file = fs.createWriteStream(filePath);
arr.forEach(function(row) {
file.write(row + "\n");
});
file.end();
file.on("finish", ()=>{ /*do something to return a promise but I don't know how*/});
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的评论!
我需要进行一些修改将一个大数据文件复制到另一个目标。fs.readFile而且fs.writeFile很慢 我需要逐行读取,修改并写入新文件。我发现了这样的事情:
fs.stat(sourceFile, function(err, stat){
var filesize = stat.size;
var readStream = fs.createReadStream(sourceFile);
// HERE I want do some modifications with bytes
readStream.pipe(fs.createWriteStream(destFile));
})
Run Code Online (Sandbox Code Playgroud)
但是如何进行修改?我试图通过data事件获取数据
readStream.on('data', function(buffer){
var str = strToBytes(buffer);
str.replace('hello', '');
// How to write ???
});
Run Code Online (Sandbox Code Playgroud)
但不了解如何将其写入文件:
TL; DR
我翻阅了一些关于解决方案npm和github寻找的东西,让我来read,并write在同一时间在两个不同的地方相同的文件.到目前为止,我实际上找不到这样的东西.是否有某种类型的模块允许这样做?
背景
本质上我的要求是在一个大文件中我需要按以下顺序:
理想情况下,用法如下:
const fd = fs.open(file, "r+");
const read = createReadStreamSomehowFrom(fd);
const write = createWriteStreamSomehowFrom(fd);
read
.pipe(new Transform(transform() {...}))
.pipe(write);
Run Code Online (Sandbox Code Playgroud)
我可以用标准来做到这一点fs.create[Read/Write]Stream但是没有办法控制两个流的流量,如果我的写入位置超出读取位置那么我正在阅读我刚才写的东西......
用例与perl -p -i -e异步读取和写入同一文件(意思是相同的inode)相同,并替换内容而不将所有内容加载到内存中.
我希望这是一个真实世界的用例,但我发现的所有实现实际上都将整个文件加载到内存中然后保存它.我在这里错过了一个已知的模块,还是需要实际写这样的东西?
我目前正在尝试找出在存储文件之前检查本地文件夹是否存在的“正确”方法,并且nodejs文档有些混乱。
fs.exists()已被废弃,你应该fs.stat()或fs.access()使用。到目前为止,一切都很好。
fs.stat():
不建议在调用fs.open(),fs.readFile()或fs.writeFile()之前使用fs.stat()检查文件是否存在。而是,用户代码应直接打开/读取/写入文件,并在文件不可用时处理引发的错误。
这说明我应该尝试编写,捕获错误,创建文件夹,然后重试。即使我正在移动/重命名文件,我也可以,所以我不直接使用上述三个功能之一。
然后,文档说:
要检查文件是否存在而不随后对其进行操作,建议使用fs.access()。
由于我不是真正在修改文件,而是“仅”修改内容,因此有人可能会认为这是修改的方法。
但是再一次,fs.access()文档详细介绍了为什么这也是一个坏主意:
不建议在调用fs.open(),fs.readFile()或fs.writeFile()之前使用fs.access()检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。而是,用户代码应直接打开/读取/写入文件,并处理无法访问文件时引发的错误。
Yadda yadda yadda,已经有一些相关的问题(here或here),但是是否有不超过两年的“最佳实践”的官方信息?
fs ×10
node.js ×10
javascript ×5
directory ×1
electron ×1
file ×1
filestream ×1
json ×1
mongojs ×1
promise ×1
stream ×1
typescript ×1