diff toolboxes/bioakustik_tools/filesys/forAllFilesInDir.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/bioakustik_tools/filesys/forAllFilesInDir.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,68 @@
+function y = forAllFilesInDir(startdir, filetypes, func, recursive, y, varargin)
+% y = forAllFilesInDir(startdir, filetypes, func, recursive, y, varargin)
+%
+% Traverse directory structure, performing for each file of a specified filetype 
+% an action defined by a function handle.
+%
+% INPUT:
+% ------
+% startdir ..... (string) Start directory. 
+%                Any directory containing a file named "skip" will be skipped.
+% filetypes .... (cell array of strings) File type filter, e.g. {'*.amc' '*.asf'} 
+%                or {'*.*'} for all files
+% func ......... (function handle) Worker function to be called for each file
+%                The function designated by func will be passed the current complete 
+%                filename (including pathname) as the first argument. If the parameter list 
+%                varargin is nonempty, a single cell array with the current filename as the
+%                first entry followed by the remaining parameters in varargin will be passed.
+% recursive .... (boolean) Flag indicating whether recursive traversal is desired or not.
+% y ............ (matrix or cell array) Initial value for output container. Usually empty ([]).
+% varargin ..... (cell array of parameters) Parameters to be passed to func, see "func".
+%
+% OUTPUT:
+% -------
+% y ............ (matrix or cell array) Collected outputs of calls to func, vertically concatenated.
+%
+% EXAMPLE:
+% --------
+% y = forAllFilesInDir('S:\data_MoCap\MoCaDaDB\AMC',{'*.amc'},@getAMCLengthInSeconds,true,[]);
+% y = forAllFilesInDir('S:\data_MoCap\MoCaDaDB\AMC',{'*.amc'},@getAMCLengthInSeconds,true,[],param1,...,paramn);
+
+if (startdir(end)~='\')
+    startdir = [startdir '\'];
+end
+
+files = dir(startdir);
+if (isempty(strmatch('skip',{files.name},'exact'))) % only process dir if no "skip" file is present!
+    disp(['Entered directory ' startdir]);
+	files = [];
+	for k=1:length(filetypes)
+        fls = dir([startdir filetypes{k}]);
+        files = [files; fls];
+	end
+	
+	for k=1:length(files)
+        disp(['Processing file ' files(k).name]);
+        if (nargin>5)
+            args = horzcat({startdir files(k).name}, varargin);   % changed by -fk to pass both dir + filename
+        else
+            args = {startdir files(k).name};   % changed by -fk to pass both dir + filename
+        end
+        a = feval(func,args{:});
+        y = [y; a];
+	end
+	
+	if (recursive)
+		dirs = dir(startdir);
+		isdir = cell2mat({dirs.isdir});
+		dirs = dirs(find(isdir));
+		for k = 1:length(dirs)
+            if (~strcmp(dirs(k).name,'.') & ~strcmp(dirs(k).name,'..'))
+                y = forAllFilesInDir([startdir dirs(k).name], filetypes, func, recursive, y, varargin{:});
+            end
+		end
+	end
+    disp(['Left directory ' startdir]);
+else
+    disp(['Skipped directory ' startdir]);
+end