此代码是U特用功能的更新版本,我最初发布为堆栈溢出的以下问题的答案:“如何在Matlab的特定目录下获取所有文件?”(http://stackoverflow.com/q/2652630/52738)。
代码库和以前的版本可以在GitHub (https://github.com/kpeaton/dirPlus)。
用法:
List = Dirplus(RootPath)将通过rootPath下方的文件夹树进行递归搜索,并收集其查找的所有文件的单元格数组列表。该列表将包含从根路径启动的每个文件的绝对路径。
LIST = dirPlus(ROOTPATH, 'PropertyName', PropertyValue,…)将根据指定的属性/值对修改文件和目录的选择方式,以及LIST的格式。用户可以设置的有效属性有:
一般:
'Struct' -一个逻辑值,决定输出LIST是否应该是DIR函数返回的形式的结构数组。如果为TRUE, LIST将是一个n乘1的结构数组,而不是单元格数组。
“深度” - DirPlus将搜索的最大文件夹树深度的非负整数值。A value of 0 will only search in ROOTPATH, a value of 1 will search in ROOTPATH and its subfolders, etc.. Default (and maximum allowable) value is the current recursion limit set on the root object (i.e. get(0, 'RecursionLimit')).
'ReturnDirs' -一个逻辑值,决定输出是文件列表还是子目录。如果为TRUE, LIST将是子目录名称/路径的单元格数组。默认是假的。
“prependpath” - 确定文件/子目表中的完整路径是否为列列表中的每个文件。默认为true将添加完整路径,否则只返回文件/子目录名称。如果'struct'参数为true,则忽略此设置。
FILE-SPECIFIC:
'FileFilter' -一个定义正则表达式模式的字符串,该模式将应用于文件名。只有匹配模式的文件才会在LIST中返回。默认值是"(即包含所有文件)。
'ValidateFcn' -一个函数句柄,它接受DIR函数返回的表单结构作为输入,并返回一个逻辑值。这个函数将应用于所有找到的文件,只有返回值为TRUE的文件才会被包含在LIST中。默认值是[](即包含所有文件)。
DIRECTORY-SPECIFIC:
'dirfilter' - 定义常规表达式模式的字符串将应用于子目录名称。只有匹配模式的子目录将被视为有效(即,列出本身或包含在列表中的文件)。默认为''(即所有子目录都有效)。'RecurseInvalid'参数的设置决定了无效的子目录是否仍然递归向下。
'ValidateDirFcn' -一个函数句柄,它接受DIR函数返回的表单结构作为输入,并返回一个逻辑值。这个函数将应用于所有找到的子目录,只有返回值为TRUE的子目录才被认为有效(即包含在LIST中或其文件包含在LIST中)。默认值是[](即所有子目录都是有效的)。'RecurseInvalid'参数的设置决定了无效的子目录是否仍然递归向下。
'重复invalid' - 仍然仍会向下退仍然递交逻辑值确定无效子目录(如“dirfilter”和'validatedirfcn'参数标识)。默认为false(即,递归搜索在无效子目录中停止)。
在演示脚本getAllFiles_demo中可以找到如何使用这些选项的示例。m或已发布格式的getAllFiles_demo.html。
肯尼斯伊顿(2021年)。dirPlus(//www.tatmou.com/matlabcentral/fileexchange/60716-dirplus), MATLAB中央文件交换。检索.
输出是否保证被排序?
如果你能提供一个例子来展示如何选择具有特定名称的文件,比如“SAT*”。m'(有些m文件名以SAT开头),这样会更有帮助。
非常有用的颂歌。
非常感谢!
巨大的贡献!
没关系-我忽略了'深度',0参数只是搜索rootFolder。
如果有一个清晰的选择如何排除所有子目录,那将会很好。我无法想到一个适当的过滤器ATM,可以以编程方式地排除任意命名的子目录。
嗨mrw7474,
我已经写了一下,只关注收集文件列表,但你已经把它扩展了一个想法,让用户也收集子目录列表。目前,没有*完成*方法来做你想要的东西。如果收集所有文件,请用`fileparts`函数提取路径,然后使用函数`唯一的结果,它将为您提供包含至少一个文件的所有子目录的列表。它不包括空的子目录。
感谢您的反馈!我希望在接下来的几天内发布一个新版本,可能具有新的名称,如“Dirplus”或“类似”。
肯,这很棒!!是否有一种方法可以在不使用GenPath的情况下获取子目录列表?我试图修改你的代码来吐出子目录列表,但我不熟悉你实现了解析器的方式。
嗨angelo,
'FileFilter'参数是一个正则表达式模式,因此您可以仅使用一个字符串来寻找多个匹配。例如,你可以像这样找到所有的。jpg, .png和.bmp文件:'\.(jpg|png|bmp)$'。
我可否只指定一个以上的“FileFilter”?