作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何在不递归遍历目录中的所有子项的情况下获取 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/
我是一名优秀的程序员,十分优秀!