2013-11-29 4 views
2

Я хочу иметь список всех полных подпапок. Список не должен содержать родительскую папку.matlab: список всех уникальных подпапок

я получить список директорий с помощью

dirs = regexp(genpath(basePath),['[^;]*'],'match'); 

Однако, что функции очень медленно. Вероятно, потому что мои папки содержат тысячи файлов.

Устранение папок родительских папок выполняется следующим образом: есть ли возможность оптимизировать это с точки зрения размера и скорости кода?

function [ ListOfDirs ] = findsubfolders(basePath) 

dirs = regexp(genpath(basePath),['[^;]*'],'match'); 

index = 0; 
for k = 1:numel(dirs) 
    currFolder = dirs{k}; 
    if numel(strrep(currFolder, basePath,'')) ~= 0 
     if isempty(strfind(currFolder, 'remove')) 
      index = index + 1; 
      selectedDirs{index} = currFolder; 
     end 
    end 
end 

dirs = selectedDirs; 
idx = 0; 
for k = 1:numel(dirs) 
    currFolder = dirs{k}; 
    isNotParentFolder = false; 
    for s = 1:numel(dirs) 
     if s ~= k 
      compFolder = dirs{s}; 
      if numel(strrep(strrep(currFolder, compFolder,''),currFolder,'')) ~= 0 
       isNotParentFolder = true; 
      end 
     end 
     if isNotParentFolder 
      idx = idx + 1; 
      ListOfDirs{idx} = currFolder; 
      break; 
     end 
    end 
end 

end 
+0

Вы пробовали http://www.mathworks.co.uk/matlabcentral/fileexchange/41135-folders-sub-folders или http://www.mathworks.co.uk/matlabcentral/fileexchange/1492 -subdir новый? – am304

+0

Подход «genpath» (и другие предложения?) В основном рекурсивно вызывается 'dir'. Известно, что это довольно медленно (для сетевых дисков?). Возможно, это может помочь: http://stackoverflow.com/questions/6385531/very-slow-dir-in-matlab –

ответ

2

Предлагаю вам использовать fileattribs для получения имен файлов и папок. Эта функция рекурсивно ищет все файлы и папки в данной базовой папке, а затем вы можете выбирать только папки. Это может быть медленным, если у вас много файлов или папок; но тогда это будет, вероятно, произойдет с любым другим подходом:

[success,message,messageid] = fileattrib('c:\users\lmendo\Documents\*'); 
%// final '\*' is needed to make the search recursive 
isfolder = [message(:).directory]; %// true for folders, false for files 
[folders{1:sum(isfolder)}] = deal(message(isfolder).Name) %// keep folders only 
%// folders is a cell array of strings with all folder names 

Чтобы сохранить только самые глубокие папки, используйте strmatch. Он проверяет, соответствует ли строка (представляющая папку) начало другой строки (которая затем будет ее вложенной папкой). Это проще (и, возможно, быстрее), чем функция findsubfolders.

isDeepest = cellfun(@(str) numel(strmatch(str,folders))==1, folders); 
%// "==1" because each folder at least matches itself. So 1 match indicates 
%// it's deepest, more matches indicates it's not. 
deepestFolders = folders(isDeepest); %// keep deepest folders only 
%// deepestFolders is a cell array of strings with all deepest-folder names 
Смежные вопросы