3

我有这样的代码:

          myFolder='C:\Users\abe7rt\Desktop\dat\1';
          filePattern=fullfile(myFolder, '*.txt');
          txtFiles=dir(filePattern); 

现在,dat 是一个包含“1,2,3”文件夹的文件夹,每个文件夹都包含 20 个 TXT 文件。前面的代码能够从 1 个文件夹中获取 txt 文件。现在我的问题是:有没有办法遍历所有目录?

4

4 回答 4

4

还有另一种可能性,使用 MATLAB 附带的 apache commons 库:

function fileNames = findAllFiles(directory, wildcardPattern)

    import org.apache.commons.io.filefilter.*;
    import org.apache.commons.io.FileUtils;
    import java.io.File;

    files = FileUtils.listFiles( File(directory),...
                                 WildcardFileFilter(wildcardPattern),...
                                 FileFilterUtils.trueFileFilter());

    fileNames = cellfun(@(f) char(f.getCanonicalPath()),...
                        cell(files.toArray()),...
                        'uniformOutput', false);
end

使用例如:

files = findAllFiles('C:\Users\abe7rt\Desktop\dat', '*.txt')

如果您还想在搜索应该下降的目录名称上应用模式,您可以简单地将 替换为FileFilterUtils.trueFileFilter()另一个WildcardFileFilter.

于 2013-09-26T11:13:16.017 回答
3

就在这里 :)

一个非常好的功能是这个:

通过 gnovice:getAllFiles

你可以像这样使用它:

fileList = getAllFiles('D:\dic');

然后你只需要摆脱非 txt 文件,例如通过检查循环内的扩展名!

于 2013-09-26T09:49:19.237 回答
2

那么你可以做类似的事情

for k=1:3
    myFolder{k}=['C:\Users\abe7rt\Desktop\dat\' num2str(k)];
    filePattern{k}=fullfile(myFolder{k}, '*.txt');
    txtFiles{k}=dir(filePattern{k});
end

如果性能/内存是一个问题,您显然可以预先分配数组/单元数组的大小。

于 2013-09-26T09:45:30.043 回答
1

您可以使用Matlab函数的递归版本fileattrib,然后选择带有.txt的txt文件regexp。此解决方案适用于任意数量的文件夹和任何级别的嵌套。

[success,message,messageid] = fileattrib('C:\Users\abe7rt\Desktop\dat\*');
[names{1:numel(message)}] = deal(message.Name);
names_txt = names(~cellfun(@isempty, regexp(names,'\.txt$')));

元胞数组names_txt包含所有 txt 文件的全名。names_txt{n}带有第 n 个文件全名的字符串也是如此。

确保将 final 添加\*到根路径。

于 2013-09-26T10:06:53.407 回答