nodejs下载文件先判断内存是不是够用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs下载文件先判断内存是不是够用相关的知识,希望对你有一定的参考价值。

参考技术A 下载大文件时请使用fs.write而不是writeFile,因为它会覆盖以前的内容。
使用Node.js的开发人员需要根据自己的业务逻辑注册相应的回调函数。这些回调函数都是异步执行的。这意味着虽然在代码结构中这些函数是依次注册的,但是它们并不依赖于自身出现的顺序,而是等待相应的事件触发。
Node.ji的强大功能体现在很多方面,如事件驱动、异步处理、非阻塞I/O等。在这里将介绍Node.js具备的不同于其它框架的特点。

nodejs如何判断目录是不是为空目录

【中文标题】nodejs如何判断目录是不是为空目录【英文标题】:how to determine whether the directory is empty directory with nodejsnodejs如何判断目录是否为空目录 【发布时间】:2017-01-06 03:14:50 【问题描述】:

我已经搜索了Nodejs Doc,但是没有找到相关的API。

所以我写了下面的代码来判断目录是否为空目录。

var fs = require('fs');

function isEmptyDir(dirnane)
    try
        fs.rmdirSync(dirname)
    
    catch(err)
        return false;
    
    fs.mkdirSync(dirname);
    return true

问题:看起来有些麻烦,用 nodejs 有更好的方法吗?

【问题讨论】:

【参考方案1】:

我想我想知道你为什么不只列出目录中的文件并查看是否有任何文件返回?

fs.readdir(dirname, function(err, files) 
    if (err) 
       // some sort of error
     else 
       if (!files.length) 
           // directory appears to be empty
       
    
);

当然,您也可以制作一个同步版本。

当然,这并不能保证目录中没有任何内容,但它确实意味着没有您有权查看的公共文件。


这是一个函数形式的 promise 版本,适用于较新版本的 nodejs:

function isDirEmpty(dirname) 
    return fs.promises.readdir(dirname).then(files => 
        return files.length === 0;
    );

【讨论】:

合理,但如果目录中有很多(即可能有数千个以上)文件,则可能会严重影响性能(时间和内存)。 @user3570671 - 你还有什么建议?而且,您是否有任何证据表明在包含 1000 个文件的目录上执行此操作实际上会导致明显的性能问题? 在下面的帖子中有一些讨论。我不一定推荐的唯一替代方法是使用“rmdir”和检查失败。 ***.com/questions/14577960/… @user3570671 - 你认为其中任何一个比列出文件更有效吗?仅供参考,操作系统非常擅长为您提供目录中的文件列表,即使有数千个。当今的现代文件系统围绕高效的目录访问进行了大量优化。例如,使用 fs.rmdir 后跟 fs.mkdir 的想法需要多次磁盘写入(不只是在目录为空时读取)。而且,所有其他涉及运行 shell 命令的解决方案都意味着启动一个新进程。 @user3570671 - 所以,如果你想走得更快,你可能会编写自己的操作系统特定和操作系统优化的 node.js 插件,在 C 代码中执行此操作并保存构建Javascript 文件名字符串数组,甚至可能使用操作系统级别的目录属性访问(node.js 不会公开)。但是,如果这值得麻烦,我会感到非常惊讶。【参考方案2】:

您尝试的简单同步功能:

const fs = require('fs');

function isEmpty(path) 
    return fs.readdirSync(path).length === 0;

【讨论】:

【参考方案3】:

有可能使用为目录创建迭代器的opendir 方法调用。

这将消除读取所有文件的需要并避免潜在的内存和时间开销

import promises as fsp from "fs"
const dirIter = await fsp.opendir(_folderPath);
const value,done = await dirIter[Symbol.asyncIterator]().next();
await dirIter.close()

done 值会告诉你目录是否为空

【讨论】:

只有在 dirIter 未完成时才应调用 close(): if (!done) await dirIter.close()

以上是关于nodejs下载文件先判断内存是不是够用的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 文件系统 fs - 是不是可以创建要下载到下载文件夹的文件

nodejs构建多房间简易聊天室

php实现文件的下载

NodeJS fs.open 在现有文件上失败(不是路径问题)

Nodejs:如何从 REST API 下载 pdf 文件?

NodeJs实现下载Excel文件