e5df19614bffcf8d4df03f5a1d469ac794955d8e
[scilab.git] / scilab / modules / fileio / macros / listfiles.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2007 - INRIA - Allan CORNET
3 // Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14
15 function files= listfiles(paths,flag,flagexpand)
16
17     // list the files in a set of directories
18     // files= listfiles(paths [,flag,flagexpand])
19     // paths           : a string matrix giving a set of pathnames (eventually ended by a pattern built with  * )
20     // flag,flagexpand : boolean optional parameters. (default value  %t ).
21     // files           : a string matrix
22
23     [lhs,rhs]=argn(0)
24     if rhs < 1  then paths="./" ; end
25     if rhs <= 1 then flag = %t ; end
26     if rhs <= 2 then flagexpand = %t ; end
27     files=[];
28
29     // Stripblanks paths
30     paths = stripblanks(paths);
31
32     // list files of the current directory
33     paths(find(paths=="")) = "./";
34
35     if flag == %t then
36         paths = pathconvert(paths,%f,flagexpand);
37     end
38
39     // list files of the root directory
40     if getos() <> "Windows" then
41         paths(find(paths=="")) = "/";
42     end
43
44     DIR_SEPARATOR=filesep();
45
46     bMulti = %f;
47     if size(paths,"*") > 1 then
48         bMulti = %t;
49     end
50
51     for i=1:size(paths,"*")  // Loop on the file/path list
52         [path,fname,extension]=fileparts(paths(i)); // Retrieve the information
53         // about the file
54         if isdir(paths(i)) then // It is a directory then returns all the file in the dir
55             path = paths(i) + filesep();
56             fname="*";
57             if bMulti then
58                 if getos() == "Windows" // Don't want this case under Linux/Unix
59                     // Windows will return the file toto even if you provided toto.*
60                     extension=".*";
61                 end
62             else
63                 extension="";
64             end
65         else
66             // It is a file
67             if path == "" then path="./",end;
68             if getos() == "Windows" // Don't want this case under Linux/Unix
69                 // Windows will return the file toto even if you provided toto.*
70                 if extension == "" then extension=".*",end;
71             end
72
73             if fname == "" then fname="*",end;
74         end
75
76         filesi=findfiles(path,fname+extension);
77
78         if filesi<>[] then
79             filesi=filesi($:-1:1);
80             // prepend with the path, if required
81             // when listing a full directory, path is not prepended
82             dirs=paths(i);
83             if part(dirs,length(dirs))<>DIR_SEPARATOR then
84                 if isdir(dirs) then
85                     if bMulti then //yes
86                         with_dir=%t;
87                         dirs = dirs + filesep();
88                     else
89                         with_dir=%f;
90                     end
91                 else                //no
92                     k=strindex(dirs,DIR_SEPARATOR);
93                     if k==[] then
94                         with_dir=%f;
95                     else
96                         dirs=part(dirs,1:k($));
97                         with_dir=%t;
98                     end
99                 end
100             else
101                 with_dir=%f;
102             end // if part(dirs,length(dirs) ...
103
104             if with_dir then
105                 filesi = dirs+filesi;
106             end
107
108             files=[files;filesi];
109         end // if filesi<>[] then
110     end // for i=1:size(paths,'*')
111 endfunction