循环文件夹?

时间:2013-09-26 09:41:28

标签: matlab loops directory

我有这样的代码:

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

是的,有:)

这是一个非常好的功能:

by gnovice: getAllFiles

你可以像这样使用它:

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

然后你必须摆脱非txt文件,例如通过检查循环中的扩展名!

答案 2 :(得分: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

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

答案 3 :(得分:1)

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

[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个文件的全名。

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