Ruby递归目录文件的又一种方法

经常派得上用场,记录一下。

递归文件做一些操作

ruby 复制代码
#encoding:utf-8

require 'pathname'

def recursive_enum_files(from_path)
	from_path = Pathname.new(from_path)
	raise ArgumentError,'must start at a directory.' unless from_path.directory?
	from_path.enum_for(:find_files,from_path)
end

private def find_files(parent,&block)
	parent.children.sort
	parent.children.each do |child|
		if child.directory?
			find_files(child,&block)
		else
			yield child if block_given?
		end
	end
end

start_path = 'E:/abcdefg'
recursive_enum_files(start_path).each do |path|
	puts (File.size?(path)/1024.0/1024.0/1024.0).round(2).to_s + 'GB => ' + path # 列出文件大小
end

对文件夹做一些操作

ruby 复制代码
#encoding:utf-8

require 'pathname'

def recursive_enum_files(from_path)
	from_path = Pathname.new(from_path)
	raise ArgumentError,'must start at a directory.' unless from_path.directory?
	from_path.enum_for(:find_files,from_path)
end

private def make_total(s)
	return Proc.new { |i| s += i }
end

private def find_files(parent,&block)
	n = make_total(0)
	parent.children.each do |child|
		if child.directory?
			n.call(find_files(child,&block))
		else
			n.call(File.size?(child))
		end
	end
	yield parent,n.call(0) if block_given?
	n.call(0)
end

start_path = 'E:/abcdefg'
recursive_enum_files(start_path).each do |path,size|
	puts (size/1024.0/1024.0/1024.0).round(2).to_s + 'GB => ' + path.to_s if size >= 1024*1024*1024*5 # 大于5GB
end
相关推荐
jerryinwuhan2 分钟前
python数据挖掘基础
python·数据挖掘·numpy
一杯美式 no sugar3 分钟前
C++入门基础
开发语言·c++
大鹏说大话4 分钟前
AI 辅助编程革命:如何利用 GitHub Copilot 等工具重塑开发效率
开发语言
rit84324995 分钟前
有限元法求转子临界转速的MATLAB实现
开发语言·matlab
echome8885 分钟前
Python 异步编程实战:asyncio 核心概念与最佳实践
开发语言·网络·python
剑海风云7 分钟前
JDK 26之安全增强
java·开发语言·安全·jdk26
左左右右左右摇晃9 分钟前
Java并发——多线程
java·开发语言·jvm
AMoon丶9 分钟前
Golang--内存管理
开发语言·后端·算法·缓存·golang·os
yunyun321239 分钟前
自动化与脚本
jvm·数据库·python
阿里嘎多学长10 分钟前
2026-03-22 GitHub 热点项目精选
开发语言·程序员·github·代码托管