You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pharo/Squeak递归获取目录文件及创建卡片方法求助

解决Pharo/Squeak中MyLibrary递归扫描指定后缀文件的问题

核心思路

你之前用FileSystem>>#allDirectories走了弯路——这个方法是遍历所有目录的,要找文件得用#allFiles。另外初始化时已经存好的myLibraryBase实例变量,就是你要指定的扫描起始路径,直接用它就行。

实现步骤与代码示例

在MyLibrary类中添加如下方法:

scanFilesWithSuffix: targetSuffix
	"递归扫描myLibraryBase下所有后缀匹配的文件,创建Card实例并记录路径"
	| matchedFiles normalizedSuffix |
	normalizedSuffix := targetSuffix asLowercase.
	"从根路径递归获取所有文件,过滤出后缀匹配的"
	matchedFiles := myLibraryBase allFiles select: [ :fileRef |
		fileRef extension asLowercase = normalizedSuffix ].
	"为每个匹配文件创建Card实例"
	matchedFiles do: [ :fileRef |
		| card |
		card := Card new.
		card localAddress: fileRef fullName. "存完整路径字符串,也可以直接存fileRef对象"
		"如果需要从文件名/路径提取Work、Author信息,这里可以补充逻辑"
		self addCard: card. "假设MyLibrary有addCard:方法来管理Card实例集合" ]

关键细节说明

  • 路径类型校验:确保myLibraryBase是DirectoryReference类型,如果初始化时存的是字符串路径,需要先转换:myLibraryBase := FileSystem disk referenceTo: selectedPath。
  • 后缀大小写兼容:把目标后缀和文件后缀都转成小写,避免因大小写差异漏扫(比如.PDF和.pdf)。
  • 路径存储选择:用fileRef fullName得到字符串格式的完整路径;如果后续需要对文件进行操作(比如打开、复制),直接存储fileRef对象会更灵活。
  • 过滤扩展:如果需要排除特定目录,可在select块中添加条件,比如fileRef parent basename ~= 'temp'来跳过临时目录。

调试小技巧

如果运行后没找到预期文件,先在Workspace里验证:

"查看当前MyLibrary实例的根路径是否正确"
MyLibrary current myLibraryBase inspect.
"查看根路径下所有文件列表"
MyLibrary current myLibraryBase allFiles inspect.

内容的提问来源于stack exchange,提问作者Rui VP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:35:15