gpt4 book ai didi

node.js - 如何在不递归遍历目录的情况下获取 node.js 中的目录大小?

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:05 24 4
gpt4 key购买 nike

如何在不递归遍历目录中的所有子项的情况下获取 node.js 中目录的大小?

例如

var fs = require('fs');
fs.statSync('path/to/dir');

会返回一个这样的对象,

{ dev: 16777220,
mode: 16877,
nlink: 6,
uid: 501,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 62403939,
size: 204,
blocks: 0,
atime: Mon May 25 2015 20:54:53 GMT-0400 (EDT),
mtime: Mon May 25 2015 20:09:41 GMT-0400 (EDT),
ctime: Mon May 25 2015 20:09:41 GMT-0400 (EDT) }

但是 size 属性不是目录的大小,而是子目录的大小(也就是其中文件的总和)。

有没有办法在不递归地找到子目录的大小(然后将它们相加)的情况下获取目录的大小(包括其中文件的大小)?

我基本上是在尝试做与 du -ksh my-directory 等效的操作,但是如果给定的目录真的很大(例如 /),那么它需要永远递归地获取真正的目录大小..

最佳答案

我使用这个简单的 async/await + fs Promises API (Node.js v14+) 解决方案...它不依赖于外部库或生成新进程,这很好:

const path = require('path');
const { readdir, stat } = require('fs/promises');

const dirSize = async directory => {
const files = await readdir( directory );
const stats = files.map( file => stat( path.join( directory, file ) ) );

return ( await Promise.all( stats ) ).reduce( ( accumulator, { size } ) => accumulator + size, 0 );
}

用法:

( async () => {
const size = await dirSize( '/path/to/directory' );
console.log( size );
} )();

这不使用任何循环构造 来递归目录,尽管它是映射/缩减数组。其他解决方案只是抽象 NPM 包/C 代码背后的递归,所以它应该都很好......


更新:根据我之前的用例,我已经使用上述解决方案来获取目录,而无需递归遍历子目录...此外,再次清楚阅读问题是原始发布者想要子目录的大小也是如此。

如果有人正在寻找它,这应该可以解决问题;然而,它在技术上并不是避免递归的法案。感谢@Inigo 的评论!

const { readdir, stat } = require('fs/promises');
const { join } = require('path');

const dirSize = async dir => {
const files = await readdir( dir, { withFileTypes: true } );

const paths = files.map( async file => {
const path = join( dir, file.name );

if ( file.isDirectory() ) return await dirSize( path );

if ( file.isFile() ) {
const { size } = await stat( path );

return size;
}

return 0;
} );

return ( await Promise.all( paths ) ).flat( Infinity ).reduce( ( i, size ) => i + size, 0 );
}

用法:

( async () => {
const size = await dirSize( '/path/to/directory' );
console.log( size );
} )();

关于node.js - 如何在不递归遍历目录的情况下获取 node.js 中的目录大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30448002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com