1 | ;+ |
---|
2 | ; |
---|
3 | ; @file_comments |
---|
4 | ; same as <pro>find</pro> except that as long as the file is 'NOT FOUND', |
---|
5 | ; <pro>isafile</pro> calls |
---|
6 | ; <proidl>DIALOG_PICKFILE</proidl>, to ask the user to select a file. |
---|
7 | ; |
---|
8 | ; @categories |
---|
9 | ; Input/Output |
---|
10 | ; |
---|
11 | ; @param filein {in}{optional} |
---|
12 | ; a proposed name. If neither filein input parameter or filename keyword are |
---|
13 | ; defined, we ask the user to choose a file. |
---|
14 | ; |
---|
15 | ; @keyword FILENAME |
---|
16 | ; a proposed filename. |
---|
17 | ; |
---|
18 | ; @keyword IODIRECTORY |
---|
19 | ; a directory where we look for the file. this |
---|
20 | ; keyword is taken into account only if the dirname |
---|
21 | ; of filein or filename is '.' |
---|
22 | ; |
---|
23 | ; @keyword NEW |
---|
24 | ; to specify that filename is a new file and that we should check only its |
---|
25 | ; path |
---|
26 | ; |
---|
27 | ; @keyword ONLYPRO |
---|
28 | ; force to look only at file ending with .pro |
---|
29 | ; |
---|
30 | ; @keyword ONLYNC |
---|
31 | ; force to look only at file ending with .nc |
---|
32 | ; |
---|
33 | ; @keyword RECURSIVE |
---|
34 | ; performs recursive searching of directory hierarchies. |
---|
35 | ; In a recursive search, <pro>find</pro> looks recursively for any and all |
---|
36 | ; subdirectories in the file hierarchy rooted at the IODIRECTORY argument. |
---|
37 | ; |
---|
38 | ; @keyword _EXTRA |
---|
39 | ; Used to pass keywords to <pro>find</pro>, |
---|
40 | ; <proidl>FILE_SEARCH</proidl> and |
---|
41 | ; <proidl>DIALOG_PICKFILE</proidl> |
---|
42 | ; |
---|
43 | ; @returns |
---|
44 | ; the filename with its path |
---|
45 | ; |
---|
46 | ; @examples |
---|
47 | ; |
---|
48 | ; IDL> print, isafile('/Users/sebastie/SAXO_RD/Commons/cm_4mesh.pro') |
---|
49 | ; /Users/sebastie/SAXO_RD/Commons/cm_4mesh.pro |
---|
50 | ; IDL> print, isafile('cm_4mesh.pro', iodir = '/Users/sebastie/SAXO_RD/Commons') |
---|
51 | ; /Users/sebastie/SAXO_RD/Commons/cm_4mesh.pro |
---|
52 | ; IDL> print, isafile('cm_4mesh.pro', iodir = !path) |
---|
53 | ; /Users/sebastie/SAXO_RD/Commons/cm_4mesh.pro |
---|
54 | ; IDL> print, isafile('cm_4mesh.pro', iodir = '/Users/sebastie/SAXO_RD', /recursive) |
---|
55 | ; /Users/sebastie/SAXO_RD/Commons/cm_4mesh.pro |
---|
56 | ; IDL> print, isafile('cm_4mesh.pro', iodir = getenv('HOME'), /recursive) |
---|
57 | ; /Users/sebastie/SAXO_RD/Commons/cm_4mesh.pro |
---|
58 | ; IDL> print, isafile('fake_file.pro') |
---|
59 | ; |
---|
60 | ; @history |
---|
61 | ; Sebastien Masson (smasson\@lodyc.jussieu.fr) |
---|
62 | ; 11/2/2000 |
---|
63 | ; June 2005: Sebastien Masson: cleaning, use for file_* functions |
---|
64 | ; |
---|
65 | ; @version |
---|
66 | ; $Id$ |
---|
67 | ; |
---|
68 | ;- |
---|
69 | FUNCTION isafile, filein, FILENAME=filename, IODIRECTORY=iodirectory $ |
---|
70 | , NEW=new, RECURSIVE=RECURSIVE, ONLYPRO=onlypro $ |
---|
71 | , ONLYNC=onlync, _EXTRA=ex |
---|
72 | ; |
---|
73 | compile_opt idl2, strictarrsubs |
---|
74 | ; |
---|
75 | CASE 1 OF |
---|
76 | (size(filein, /type))[0] EQ 7:fileout = filein |
---|
77 | keyword_set(filename):fileout = filename[0] |
---|
78 | ELSE:fileout = 'file that is not existing' |
---|
79 | ENDCASE |
---|
80 | if size(fileout, /type) NE 7 THEN return, -1 |
---|
81 | ; |
---|
82 | CASE 1 OF |
---|
83 | keyword_set(onlypro): filter = '*.pro' |
---|
84 | keyword_set(onlync): filter = '*.nc' |
---|
85 | else: filter = '*' |
---|
86 | ENDCASE |
---|
87 | ; |
---|
88 | basename = file_basename(fileout) |
---|
89 | dirname = file_dirname(fileout) |
---|
90 | ; should we redefine dirname? |
---|
91 | if fileout NE dirname+'/'+basename AND dirname EQ '.' AND NOT keyword_set(iodirectory) then dirname = '' |
---|
92 | if keyword_set(iodirectory) AND dirname EQ '.' then dirname = iodirectory |
---|
93 | ; |
---|
94 | if keyword_set(new) then return, dirname + path_sep() + basename |
---|
95 | ; |
---|
96 | fileout = find(basename, iodirectory = dirname $ |
---|
97 | , recursive = recursive, /unique, /firstfound, ONLYPRO = onlypro $ |
---|
98 | , ONLYNC = onlync, _extra = ex) |
---|
99 | WHILE fileout[0] EQ 'NOT FOUND' DO BEGIN |
---|
100 | fileout = dialog_pickfile(path = dirname[0], filter = filter, _extra = ex) |
---|
101 | if fileout EQ '' THEN RETURN, report('check/find file canceled') |
---|
102 | ; check again everything... |
---|
103 | basename = file_basename(fileout) |
---|
104 | dirname = file_dirname(fileout) |
---|
105 | ; check if the name of the dirname is ok |
---|
106 | dirname = isadirectory(dirname, title = 'choose a directory for the file ' $ |
---|
107 | + basename) |
---|
108 | ; if we cancel the check |
---|
109 | IF size(dirname, /type) NE 7 THEN return, report('check/find file canceled') |
---|
110 | fileout = find(basename, iodirectory = dirname $ |
---|
111 | , recursive = recursive, /unique, /firstfound, ONLYPRO = onlypro $ |
---|
112 | , ONLYNC = onlync, _extra = ex) |
---|
113 | ENDWHILE |
---|
114 | ; |
---|
115 | RETURN, fileout |
---|
116 | END |
---|