2017-05-31 4 views
0

Ich arbeite an einem Matlab-Skript, das rekursiv durch ein Verzeichnis und versucht, alle Dateien eines bestimmten Typs zu finden. Ich verwende ein Array als eine Art Stapel.Matlab Index Indizes Fehler, läuft perfekt interaktiv

Die Linie

dirstack{end + 1} = filesInCurrentDir(i); 

ausfällt. Jedoch, wenn ich dbstop if error benutze und die exakt selbe Linie, Wort für Wort, von Hand laufen lasse, funktioniert es gut.

Es schlägt fehl, auch wenn ich einen Index length(dirstack) + 1

vorbelegen Gibt es einen Grund, dies würde nicht in einer Skriptumgebung arbeiten, aber es würde in einer interaktiven Umgebung?

Mindestarbeitsbeispiel:

DIR='.'; 
dirstack{1} = DIR; 
while length(dirstack) ~= 0 %loop while there's still directories to look for 
    curdir = dirstack{1}; %the working directory is popped off the top of the stack 
    dirstack{1} = []; %delete the top element, finishing the pop operation 
    filesInCurrentDir = dir(curdir); 
    for i=3:length(filesInCurrentDir) % start at 3, dir returns 1:. 2:.. and we don't want those 
     if filesInCurrentDir(i).isdir; %if this is a directory 
      dirstack{end+1} = filesInCurrentDir(i); 
     elseif strcmp(filesInCurrentDir(i).name(end+[-3:0], '.jpg')) == 1 %if it's a psdata file 
      files{end+1} = [curdir, filesep, filesInCurrentDir(i_.name)]; 
     end 
    end 

end 

Antwort

0

Dies ist, wie ich alle JPG-Dateien unter aktuellen Ordner bekommen würde und dessen Unterordner:

dirs = genpath(pwd); % dir with subfolders 
dirs = strsplit(dirs, pathsep); % in cellstr for each dir 
files = {}; 
for i = 1:numel(dirs) 
    curdir = [dirs{i} filesep]; 
    foo = dir([curdir '*.jpg']); % all jpg files 
    foo([foo.isdir]) = []; % just in case .jpg is folder name 
    foo = strcat(curdir, {foo.name}); % full file names 
    files = [files foo]; % cell growing 
end 

auf Ihre Frage nun zurück. Es gibt mehrere Fehlerstellen in Ihrem Code. Sie können meinen korrigierten Code vergleichen und meine Kommentare im Code überprüfen:

dirstack = {pwd}; % ensure init dirstack to current dir 
files = {}; 
while length(dirstack) ~= 0 % better ~isempty(dirstack) 
    curdir = dirstack{1}; 
    dirstack(1) = []; % dirstack{1} = [] sets first cell to [], wont remove the cell as you want 
    filesInCurrentDir = dir(curdir); 
    for i=3:length(filesInCurrentDir) % this works for Windows, but may not be safe to always skip first two 
     if filesInCurrentDir(i).isdir 
      dirstack{end+1} = filesInCurrentDir(i); 
     elseif strcmp(filesInCurrentDir(i).name(end+[-3:0]), '.jpg') == 1 % had error here 
      files{end+1} = [curdir, filesep, filesInCurrentDir(i).name]; % had error here 
     end 
    end 

end 
+0

Danke, ich werde die neue Methode ausprobieren. Ich verstehe immer noch nicht, warum ich das ursprüngliche Problem habe? Vor allem, weil die genaue Linie interaktiv läuft, und es sieht nicht so aus, als ob Sie irgendwelche Probleme damit hätten? –

+0

Ich erklärte den Fehler im Kommentar des Codes. Ein schwerwiegender Fehler ist die Verwendung von dirstab (1) anstelle von "droppen" {1}, wenn Sie ein Zellenelement entfernen. Andere sind wie Syntaxfehler oder Tippfehler (ich beschriftet mit "hatte Fehler hier"). Die Fehlermeldung ist wahrscheinlich auf den Syntaxfehler zurückzuführen. Ich glaube also nicht, dass Ihr minimales Beispiel zeilenweise funktioniert. –

Verwandte Themen