50% gehen auf genpath
50% auf die dir(paths).
meine eigentliche Bearbeitung nimmt fast keine Zeit in Anspruch.
Ich kann nicht glauben dass es soo lange dauert. Bei einem kleinen Ordner schon über 2,5 Minuten.
Ich mach etwas ähnliches wie ein Datei Explorer, nur werden sie nach anderen Kritierien geordnet. Wäre es vlt. schneller wenn ich das über Java versuche? Weiß leider nicht wie ich das genau umsetzen würde.
ein anderer Vorschlag: warum schreibst du nicht alles via cmd in einem *.txt Datei und liest es in Matlab wieder ein.
Unter cmd:
dir /b /s *.bin > Bin.txt
geht verdammt schnell
danke erstmal für den Tipp. Ich bekomme jedoch die Fehlermeldung
"CMD does not support UNC paths as current directories".
Es handelt sich dabei um ein Netzwerklaufwerk. Es gibt wohl ein Workaround mit http://support2.microsoft.com/kb/317379. Ich möchte das jedoch ungern machen, da dies ein Netzwerk auf meiner Arbeit ist.
dirData = dir(pwd); %# Get the data for the current directory
dirIndex = [dirData.isdir]; %# Find the index for directories
fileList = {dirData(~dirIndex).name}'; %'# Get a list of the files
if ~isempty(fileList)
fileList = cellfun(@(x)fullfile(dirName,x),... %# Prepend path to files
fileList,'UniformOutput',false);
end
subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories
%# that are not '.' or '..'
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path
fileList = [fileList; getAllFiles(nextDir)]; %# Recursively call getAllFiles
end
Dadurch wird das Schreiben/Lesen von Dateien vermieden, und es klappt auch direkt mit Netzwerkpfaden.
Eine andere:
Letztlich ist es ja doppelt gemoppelt, erst alle Verzeichnisse zu suchen und dann nochmal nach den Dateien in den Verzeichnissen.
Man könnte, den Ansatz von genpath verwendend, auch direkt in allen Ordnern nach .bin-Dateien suchen.
In den meisten Fällen wird sich die for-Schleife in diesem Code auch auf
dirData = dir(pwd); %# Get the data for the current directory
dirIndex = [dirData.isdir]; %# Find the index for directories
fileList = {dirData(~dirIndex).name}'; %'# Get a list of the files
if ~isempty(fileList)
fileList = cellfun(@(x)fullfile(dirName,x),... %# Prepend path to files
fileList,'UniformOutput',false);
end
subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories
%# that are not '.' or '..'
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path
fileList = [fileList; getAllFiles(nextDir)]; %# Recursively call getAllFiles
end
Netzlaufwerk unter Win 7 einbinden:
Start->Computer->oben rechts im Reiter Netzlaufwerk verbinden.
Laufwerkbuchstaben vergeben und den Pfad eintragen und fertig
nur damit's nicht übersehen wird: der Umweg über die Datei ist nicht nötig; man kann mit system den dir-Aufruf auch aus MATLAB heraus ausführen und dort das Ergebnis direkt nach-/weiterverarbeiten.
es sieht so aus, als würde Haralds Methode bei mir funktionieren ohne UNC Fehler. Scheint als legt er das Laufwerk automatisch irgendwie an. Ich bekomme jedenfalls dann eine Pfad mit Z:\, habe das in der cmd vorher mit \\Pfad eingegeben, vielleicht lag hier das Problem. Im Explorer ist jedoch kein Z: eingetragen.
Jedenfalls hier der Code, falls es noch andere interessiert
Ich möchte zwar den Thread ungern ausgraben, aber da Ich eine deutlich bessere Methode gefunden habe möchte ich diese hier präsentieren:
Code:
function outFilelist = fcnCreateFileList(inFolder,inSave,inEnding)
%% Alex4456 2014 % Matlab ließt die Dateiliste aus einer .txt Datei aus, die von durch ein CMD Befehl erzeugt wird. Dazu sind Schreibrecht in dem Ordner inSave notwendig. Dateien werden anschließend gelöscht. % inFolder Pfadangabe. In diesem und allen unterordner wird gesucht % inSave Pfadangabe. In diesem Ordner wird 1 .txt Datei erzeugt % inEnding Endung der Dateinamen. Nach dieser Dateiendung wird gesucht, sofern leer '', dann % wird nach allen Endungen gesucht %
outFilelist = 0;
if ~isdir(inSave) || ~isdir(inFolder) return end
pathFilelist = [inSave,'\filelist.txt'];
ifstrcmp(inEnding,'') dos =(['cd ',inFolder,' & dir /s /b > ',pathFilelist]);
else dos =(['cd ',inFolder,' & dir /s /b *.',inEnding,' > ',pathFilelist]);
end while(~exist(pathFilelist, 'file'))
sleep(0.5); % or whatever interval you desire end
fileID = fopen(pathFilelist);
fileLoad = textscan(fileID,'%s');
fclose(fileID);
try delete(pathFilelist);
end
outFilelist = fileLoad{1,1};
Benchmark bei 180.000 Dateien in 1950 Ordner
Methode 1: über [status, list] = system('dir /b /s *.bin'): 550 Sek.
Methode 2: meine Funktion über Batc: 9 Sek.
Benchmark bei 13.000 Dateien in 1 Ordner
Methode 1: über [status, list] = system('dir /b /s *.bin'): 9 Sek
Methode 2: meine Funktion über Batch: 0.15 Sek.
Kennt jemand den Grund warum das so langsam ist?
Sofern man nur system(..) schreibt, ohne Rückgabewert ist es deutlich schneller. Mir ist natürlich bewusst das die Speicherung Zeit in Anspruch nimmt, aber meiner Menung nach unverhältnis mäßig viel.
edit: ich sehe gerade das Vito das mit der .txt bereits vorgeschlagen hat, dann sei hier nochmal ausdrücklich gesagt, dass das die schnellere Methode ist.
Grüße
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.