我以前在电子应用中使用此代码来获取目录的大小
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不能识别为这样的内部命令...
否则,在所有三个平台和所有机器上,都没有通用的方法来获取目录的大小。
答案 0 :(得分:2)
1。。计算机中安装的Windows可能具有sysinternals du命令。并非在所有Windows安装中都存在。您可能更喜欢使用windirstat.info或类似www.getfoldersize.com的本地语言。
2。。由于使用UNIX和Linux命令来估计文件空间使用情况,因此它可以在OS等任何UNIX系统上工作。
3。。du命令是用于报告文件系统磁盘空间使用情况的命令行实用程序。它可用于找出文件和文件夹的磁盘使用情况,并显示正在占用的空间。它支持仅显示目录或所有文件,并显示总计,以人类可读的格式输出,并且可以与其他UNIX工具结合使用,以输出系统上文件夹最大文件的排序列表。参见:https://shapeshed.com/unix-du/
如果需要它在UNIX和非UNIX OS上运行,则应首先检查程序用户使用的是哪个OS,然后根据运行它的操作系统执行另一个命令。 / p>
答案 1 :(得分:1)
du是Linux命令。它通常在Windows中不可用(不知道Mac,抱歉)
child_process模块提供了生成子进程的功能。看来您只是在操作系统中执行命令。因此,要使一个解决方案可以在多个系统上运行,您可以有两个选择:
您必须在Windows系统中安装了一些linux工具,但是您不能依靠在任何常见Windows中都可以使用它们
答案 2 :(得分:1)
非常原始和同步的代码。对于产品,您必须切换到异步功能。
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');
答案 3 :(得分:1)
您可以使用内置的node.js
fs
程序包的stat
命令...但是,如果您安装了整个驱动器,男孩会在内存中炸毁。最好坚持使用经过验证的节点外部的工具。
https://repl.it/@CodyGeisler/GetDirectorySizeV2
const { promisify } = require('util');
const watch = fs.watch;
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
const path = require('path');
const { resolve } = require('path');
const getDirectorySize = async function(dir) {
try{
const subdirs = (await readdir(dir));
const files = await Promise.all(subdirs.map(async (subdir) => {
const res = resolve(dir, subdir);
const s = (await stat(res));
return s.isDirectory() ? getDirectorySize(res) : (s.size);
}));
return files.reduce((a, f) => a+f, 0);
}catch(e){
console.debug('Failed to get file or directory.');
console.debug(JSON.stringify(e.stack, null, 2));
return 0;
}
};
(async function main(){
try{
// Be careful if directory is large or size exceeds JavaScript `Number` type
let size = await getDirectorySize("./testfolder/")
console.log('size (bytes)',size);
}catch(e){
console.log('err',e);
}
})();
答案 4 :(得分:0)
我知道这个问题有点老了,但是最近我发现自己正在寻找一个清晰,简短的答案,以解决问题,如果它对某人有用,那么它是否不仅消耗了几个字节。
我必须澄清,我并不是任何事情的专家,但是我喜欢学习,这就是我为寻求解决方案而学到的东西:
*/
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 some路径时执行文件或命令,获取文件或目录的磁盘利用率,并再次进行绝对拍打,因此有必要进行将结果解析为整数后,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
我不会说英语,所以我使用翻译作为口译员,对语言错误我深表歉意。