Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用du命令获取文件夹的大小_Javascript_Node.js_Spawn_Du - Fatal编程技术网

Javascript 使用du命令获取文件夹的大小

Javascript 使用du命令获取文件夹的大小,javascript,node.js,spawn,du,Javascript,Node.js,Spawn,Du,我曾经在我的电子应用程序中使用此代码获取目录的大小 var util = require('util'), spawn = require('child_process').spawn, size = spawn('du', ['-sh', '/path/to/dir']); size.stdout.on('data', function (data) { console.log('size: ' + data); }); 它在我的机器里工作。当我在另一台windows机器上构建并运

我曾经在我的电子应用程序中使用此代码获取目录的大小

var util  = require('util'),
spawn = require('child_process').spawn,
size    = spawn('du', ['-sh', '/path/to/dir']);

size.stdout.on('data', function (data) {
console.log('size: ' + data);
});
它在我的机器里工作。当我在另一台windows机器上构建并运行时,它抛出的du不会被识别为这样的内部命令

  • 为什么这只适用于我的机器而不适用于其他windows机器
  • 而且我也怀疑它在linux/mac机器上是否有效
  • 这个du命令是如何工作的

  • 或者,在所有三种平台和所有机器中,是否有任何通用的方法来获取目录的大小。

    du是一个Linux命令。它通常在Windows中不可用(对不起,不知道Mac)

    子进程模块提供生成子进程的能力。看起来您只是在操作系统中执行命令。因此,要使解决方案在多个系统上工作,您可以有两种选择:

    • 检查操作系统,并执行(使用spawn)适当的系统命令,就像您现在所做的那样。这使代码保持最简单
    • 或者,使用JavaScript代码(StackOverflow中有许多关于如何在node.js中获取目录大小的问题)。我认为这将是覆盖任何操作系统的最安全的方式,而不必担心命令支持

    您必须在Windows系统中安装了一些linux工具,但不能指望它们在任何普通Windows中都可用。它通常在Windows中不可用(对不起,不知道Mac)

    子进程模块提供生成子进程的能力。看起来您只是在操作系统中执行命令。因此,要使解决方案在多个系统上工作,您可以有两种选择:

    • 检查操作系统,并执行(使用spawn)适当的系统命令,就像您现在所做的那样。这使代码保持最简单
    • 或者,使用JavaScript代码(StackOverflow中有许多关于如何在node.js中获取目录大小的问题)。我认为这将是覆盖任何操作系统的最安全的方式,而不必担心命令支持

    您必须在Windows系统中安装了一些linux工具,但您不能指望这些工具在任何普通Windows中都可用。

    1。您机器上安装的Windows可能具有该命令。并非所有windows安装中都有此功能。您可能更喜欢使用windirstat.info或类似的本地语言

    2.由于du是用于估计文件空间使用情况的UNIX和Linux命令,因此它应该可以在任何类似UNIX的操作系统中工作

    3.du命令是一个用于报告文件系统磁盘空间使用情况的命令行实用程序。它可以用来找出文件和文件夹的磁盘使用情况,并显示占用空间的内容。它支持仅显示目录或所有文件、显示总计、以人类可读的格式输出,并且可以与其他UNIX工具组合以输出系统上最大文件夹文件的排序列表。见:


    如果需要它在UNIX和非UNIX操作系统上工作,应首先检查程序用户使用的操作系统,然后根据运行该程序的操作系统执行不同的命令。

    1。计算机中安装的windows可能有该命令。并非所有windows安装中都有此功能。您可能更喜欢使用windirstat.info或类似的本地语言

    2.由于du是用于估计文件空间使用情况的UNIX和Linux命令,因此它应该可以在任何类似UNIX的操作系统中工作

    3.du命令是一个用于报告文件系统磁盘空间使用情况的命令行实用程序。它可以用来找出文件和文件夹的磁盘使用情况,并显示占用空间的内容。它支持仅显示目录或所有文件、显示总计、以人类可读的格式输出,并且可以与其他UNIX工具组合以输出系统上最大文件夹文件的排序列表。见:


    如果需要它在UNIX和非UNIX操作系统上工作,应首先检查程序用户使用的操作系统,然后根据运行它的操作系统执行不同的命令。

    非常原始且同步的代码。对于产品,必须切换到异步函数

    const path = require('path');
    const fs = require('fs');
    
    function dirsizeSync(dirname) {
        console.log(dirname);
        let size = 0;
        try {
            fs.readdirSync(dirname)
                .map(e => path.join(dirname, e))
                .map(e => {
                    try {
                        return {
                            dirname: e,
                            stat: fs.statSync(e)
                        };
                    } catch (ex) {
                        return null;
                    }
                })
                .forEach(e => {
                    if (e) {
                        if (e.stat.isDirectory()) {
                            size += dirsizeSync(e.dirname);
                        } else if (e.stat.isFile()) {
                            size += e.stat.size;
                        }
                    }
                });
        } catch (ex) {}
        return size;
    }
    
    console.log(dirsizeSync('/tmp') + ' bytes');
    

    非常原始和同步的代码。对于产品,必须切换到异步函数

    const path = require('path');
    const fs = require('fs');
    
    function dirsizeSync(dirname) {
        console.log(dirname);
        let size = 0;
        try {
            fs.readdirSync(dirname)
                .map(e => path.join(dirname, e))
                .map(e => {
                    try {
                        return {
                            dirname: e,
                            stat: fs.statSync(e)
                        };
                    } catch (ex) {
                        return null;
                    }
                })
                .forEach(e => {
                    if (e) {
                        if (e.stat.isDirectory()) {
                            size += dirsizeSync(e.dirname);
                        } else if (e.stat.isFile()) {
                            size += e.stat.size;
                        }
                    }
                });
        } catch (ex) {}
        return size;
    }
    
    console.log(dirsizeSync('/tmp') + ' bytes');
    

    您可以使用内置的
    node.js
    fs
    包的
    stat
    命令。。。但是如果你开了一整趟车,这个会在记忆中爆炸吗。最好坚持使用节点之外经过验证的工具


    您可以使用内置的
    node.js
    fs
    包的
    stat
    命令。。。但是如果你开了一整趟车,这个会在记忆中爆炸吗。最好坚持使用节点之外经过验证的工具


    我知道这个问题有点老了,但最近我发现自己在寻找一个关于如何做的清晰而简短的答案,如果它对某人有用,那么,如果它不仅消耗了几个字节

    我必须澄清,我不是任何方面的专家,但我喜欢学习,这就是我在寻找解决方案时学到的:

    */
    First declare the needs of a Child Process and [execSync()][1]
    "the method will not return until the child process has fully closed"
    */
    
    此脚本是一个同步操作

    //Declares the required module
    const execSync = require('child_process').execSync;
    //Declare the directory or file path
    const target = "Absolute path to dir or file";
    /*
    Declare a variable or constant to store the data returned,
    parse data to Number and multiplying by 1024 to get total 
    bytes
    */
    const size = parseInt(execSync(`du '${target}'`)) * 1024;
    //Finally return or send to console, the variable or constant used for store data
    return size;
    
    使用exec或execSync可以在Unix系统中执行文件或命令,当在终端中执行du'some path'时,获取文件或目录的磁盘利用率,并再次获取绝对pat,因此需要对结果的整数进行解析,execSync将获得一个缓冲区作为结果

    我使用模板字符串作为参数,以避免编写更多的代码行,因为您不必处理字符串路径中的空格问题,此方法支持这些空格

    //If executed in a terminal
    du 'path to file or directory including white spaces in names'
    // returns something like
    125485 path to file or directory including white spaces in names
    

    我不会说英语,所以我使用翻译作为翻译,我为语言错误道歉

    我知道这个任务