2013-09-26 3 views
3

У меня есть такой код:Петля по папкам?

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

Теперь Даты является папкой, которая содержит «1.2.3» папку и каждый из этих папок содержат 20 TXT файлов. Предыдущий код способен получить файлы txt из 1 папки. Теперь мой вопрос: есть ли способ перебрать все каталоги?

ответ

3

да есть :)

Очень хорошая функция это одна:

by gnovice: getAllFiles

Вы можете использовать его как это:

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

Тогда вы просто должны получить избавиться от не-txt-файлов, например проверив расширение в цикле!

+0

Но в этом случае я не смогу контролировать все данные * слишком много, потому что у меня есть 20 подпапок? – mecaeng

+0

ну, это что-то особенное ... какое сообщение об ошибке вы получаете? –

+0

nooo. Он работает действительно, но я просто получил все txt в папках thess, поэтому я не смогу управлять этими txt-файлами. – mecaeng

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 

Вы можете, очевидно, предварительно выделить размеры массивов/Массивы ячеек, если производительность/память является проблемой.

+0

Я не понял, как предварительно распределить размеры массивов? Несоответствие размеров подзаголовков. – mecaeng

+0

На какой строке вы получаете сообщение об ошибке? – am304

+0

второй myFolder (k) = ['C: \ Users \ abe7rt \ Desktop \ dat \' num2str (k)]; – mecaeng

1

Вы можете использовать рекурсивную версию функции Matlab fileattrib, а затем выбрать файлы 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 Ячейки содержит полные имена всех текстовых файлов. Таким образом, names_txt{n} - это строка с полным именем n-го файла.

Убедитесь, что вы добавили окончательный \* в корневой путь.

4

Еще одна возможность, используя библиотеку Apache Commons, которая поставляется с MATLAB:

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.

+0

Можно ли использовать это, но в папках? Например, можно ли перебирать имена папок, а не файлы? Следовательно, результатом будет список папок (путь) с указанным именем? –

Смежные вопросы