我正在从节点应用程序中的客户端应用程序接收分块文件。不同的块来自不同的请求。然后,我通过使用带填充的写入流写入单个文件,将这些块组装成服务器上的整个文件。
我遇到的问题是,当我写入第一个块时,我需要创建文件,而对于所有后续块,我只需要修改该文件。为了实现这一点,我使用fs.createWriteStream(filePath)- 这将在每次调用它时重写该文件,因此我需要传递特殊标志:r+。这个标志的问题是它只适用于已经存在的文件,如果找不到它会抛出错误。
所以我想知道是否有任何标志会强制 fs 创建一个文件(如果它不存在)或更新现有文件而不显式调用 fs.exists
这是我目前想到的:
//check if file exists
fs.exists(filePath, function(exists) {
//if it does exist, then modify it
if (exists) {
flags = 'r+';
//else create a new one
} else {
flags = 'w';
}
var ws = fs.createWriteStream(filePath, {
start: chunkInfo.chunkNumber * chunkInfo.chunkSize, //set chunk padding
flags: flags
});
file.pipe(ws); //pipe the file read stream to write stream
});
Run Code Online (Sandbox Code Playgroud) 我不太确定,也许我错过了一些明显的东西,但我不知道如何链接两个承诺。
我的基于回调的代码看起来像这样:
async.series([
function (cb) {
// Create the directory if the nodir switch isn't on
if (!nodir) {
fs.mkdir('somedirectory', function (err) {
if (err) {
log('error while trying to create the directory:\n\t %s', err)
process.exit(0)
}
log('successfully created directory at %s/somedirectory', process.cwd())
cb(null)
})
}
cb(null)
},
function (cb) {
// Get the contents of the sample YML
fs.readFile(path.dirname(__dirname) + '/util/sample_config.yml', function (err, c) {
var sampleContent = c
if (err) {
log('error while reading the sample file:\n\t %s', …Run Code Online (Sandbox Code Playgroud) 我正在接收二进制流中的图像,如下所示,但是当我尝试使用以下数据创建缓冲区时,缓冲区似乎为空。问题是缓冲区不理解这种格式吗?
\n\n\n\n\nV\xef\xbf\xbdq)\xef\xbf\xbdEB\\u001599!F":"\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\\u000b\ xef\xbf\xbd\xef\xbf\xbd3\xef\xbf\xbd\xef\xbf\xbd5%\xef\xbf\xbdL\xef\xbf\xbd\\u0018\xef\xbf\xbd\xef\xbf\ xbdpO^::\xef\xbf\xbd~\xef\xbf\xbd\xef\xbf\xbdm\xef\xbf\xbd<\\u001e\xef\xbf\xbd\xef\xbf\xbdL\xef\xbf\ xbd\xef\xbf\xbdk\xef\xbf\xbd%G\xef\xbf\xbd$b\\u0003\\u0011\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd=q\ xef\xbf\xbdV=\xef\xbf\xbd\xef\xbf\xbdA\\u0018\xef\xbf\xbd\xef\xbf\xbdO\xef\xbf\xbd\xef\xbf\xbdU\xef\xbf\ xbd\xef\xbf\xbd\xef\xbf\xbdm\xef\xbf\xbdB\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\\u00038\xef\xbf\xbd\xef\xbf \xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd0a\xef\xbf\xbd_\xef\xbf\xbd\xef\xbf\xbd#\\u001b\xef\xbf\xbd\xef \xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\\f\xef\xbf\xbd\xef\xbf\xbd(\xef\xbf\xbd3\xef\xbf\xbd\\u0003\xef\ xbf\xbd\xef\xbf\xbd\xef\xbf\xbdnGjr\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdMt\\\xef\xbf\xbd\\u0014g\xef\xbf\xbd \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd~\xef\xbf\xbd#\xef\xbf\xbdQ\xef\xbf\xbd\xef\xbf\xbd\ng\xef\xbf \xbdK\xef\xbf\xbd\xef\xbf\xbds\xef\xbf\xbd\xef\xbf\xbd@C\xef\xbf\xbd\xef\xbf\xbd\\u001cS\xef\xbf\xbd` \\u000bps\xef\xbf\xbdGnzq\xef\xbf\xbdRg\xef\xbf\xbd\\fu\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdC\\u0015\xef\xbf\ xbd\\u001d3\xef\xbf\xbdE.BI\\u0007\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd
\n
var buffer = new Buffer(req.body, \'binary\')\n console.log("BUFFER:" + buffer)\nfs.writeFile(\'test.jpg\', buffer, function(err,written){\n if(err) console.log(err);\n else {\n console.log("Successfully written");\n }\n});\nRun Code Online (Sandbox Code Playgroud)\n 我想通过循环按特定顺序将行附加到文件中,该文件是 Node 中的可写流。
这是我正在谈论的内容的简化版本:
var fs = require('fs');
var outfile = fs.createWriteStream('outfile.txt');
for (var i = 0; i < 200; i++) {
outfile.write('i', function (err, len) {
console.log('written');
});
}
Run Code Online (Sandbox Code Playgroud)
我需要按顺序写入文件,这意味着它将12345...etc按顺序写入。我的理解是这outfile.write是异步的,这意味着文件可能会被乱序写入 - 这是正确的吗?
我从节点文档中看到
请注意,在同一个文件上多次使用 fs.write 而不等待回调是不安全的。对于这种场景,强烈建议使用 fs.createWriteStream。
所以我相信使用流是最好的,但是,我不确定在进入循环中的下一次迭代之前是否能保证数据块已成功写入。我应该怎样做呢?谢谢。
我尝试了这个简单的代码
var fs = require('fs');
var stream = fs.createReadStream(fileName);
stream.on('readable', function () {
console.log("readable event called");
} );
Run Code Online (Sandbox Code Playgroud)
我注意到,如果文件是空的,则不会调用该事件。有没有优雅的方法来检查文件是否为空?
我想从文件中读取数据并将其添加到存储在内存中的对象中。文件 text.txt 中的数据大致如下所示:
One: {title: 'One' ,
contributor: 'Fred',
summary: 'blah' ,
comments: 'words' },
Two: {title: 'Two' ,
contributor: 'Chris' ,
summary: 'blah blah i'm a blah' ,
comments: '' },
Run Code Online (Sandbox Code Playgroud)
我试图将其设置为一个空对象,如下所示:
var fs = require('fs');
var text = Object.create(null);
fs.readFile("./public/text.txt", "utf-8", function(error, data) {
text = { data };
});
Run Code Online (Sandbox Code Playgroud)
然而,当我登录text到控制台时,它看起来像这样:
{ data: 'One: {title: \'One\' ,\ncontributor: \'Fred\',\nsummary: \'blah\' ,\ncomments: \'words\' },\n \nTwo: {title: \'Two\' ,\ncontributor: \'Chris\' ,\nsummary: \'blah blah i\'m a blah\' ,\ncomments: \'\' },\n\n' …Run Code Online (Sandbox Code Playgroud) 我使用fs.readdir通过递归枚举文件和文件夹,然后使用fs.stat为每个文件获取可访问性详细信息。
我需要根据fs.stat的信息检测所有隐藏文件和系统文件,以便我可以从枚举中跳过它们。
我知道我们获得的属性mode应该对我们有帮助,但我不知道如何正确使用它,因此它可以在每个操作系统上运行。
PS我看到这个问题:How to ignore hide files in fs.readdir result,但答案不好。
我一直在学习 Nodeschool 教程:learnyounode,可以在此处找到。我正在研究挑战五(FILTERED LS)。
挑战是这样的:
创建一个程序,打印给定目录中的文件列表,并按文件扩展名进行过滤。您将获得一个目录名作为程序的第一个参数(例如“/path/to/dir/”),并提供一个文件扩展名作为第二个参数进行过滤。
到目前为止,这是我的代码:
var fs = require('fs');
var path = require('path');
extname = '.' + path.extname(process.argv[3]);
console.log(extname);
fs.readdir(process.argv[2].toString(), function(err, list) {
if (err) {
throw err;
}
list.filter(extname);
console.log(list);
});
Run Code Online (Sandbox Code Playgroud)
如何有效地过滤掉作为控制台参数给出的所有文件?它与path.extname有什么关系吗?如果是这样,怎么办?我尝试过使用.filter(),但这似乎不起作用。有人也能向我解释它的.filter()工作原理及其参数吗,因为我发现文档有点令人困惑。最后,是否有比 更好的方法在单独的行上输出数组的元素console.log()?
谢谢
我正在尝试在电子中创建一个文本编辑器。我的 HTML 文件中有这个:
<pre><div class="file-content" contenteditable="true"></div></pre>
<button onclick="saveFile();">Save</button>
Run Code Online (Sandbox Code Playgroud)
在 Javascript 文件中,我有这个:
const fs = require('fs');
const $ = require('jquery');
function saveFile() {
fs.writeFile([filepath], $('.file-content').text(), function (err) {
if (err) return console.log(err);
});
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入包含几行的文本时,当我单击保存按钮时,文本会被写成一行。例如:
输入:
line1
line2
line3
Run Code Online (Sandbox Code Playgroud)
保存后的文件:
line1line2line3
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Next.js 为自己编写一个基本的本地 api,它是一个时间线生成器,我一直在从 api 文件夹中实际读取文件。
我在本地应用程序中想要什么:
1.一个简单的页面,我可以在其中输入一个事件,带有日期和描述
2.在某处打开一个 list.json 文件,然后将新事件推送到该 json 文件,并在其上写入。
我目前在做什么以及我被困在哪里:
我知道我们不能在客户端写入文件,所以我开始查看下一个 js 中的 api 路由以访问 JSON 文件,但我什至无法读取它!
我在 pages 文件夹中有一个 api 文件夹,在这个 api 文件夹中我有两个文件:一个是 list.json 文件,我之前在其中手动编写了一些具有各自日期的事件;另一个是 getlist.js,代码如下:
var fs = require('fs');
export default function getList(req, res) {
const rawList = fs.readFile('list.json');
var list = JSON.parse(rawList);
res.json(list);
}
Run Code Online (Sandbox Code Playgroud)
现在在 pages 文件夹中,我有一个 index.js 文件,我尝试使用 getStaticProps() 访问这个 getlist.js api,如下所示:
import getlist from './api/getlist'
export async function getStaticProps(){
var list = getlist();
return {
props: {
list
}
}
} …Run Code Online (Sandbox Code Playgroud)