pro cdf_file_names_index,name,info,set=set,get=get
common cdf_file_names_index_com,index
f = {indexformat,name:'',ptr:ptr_new()}
n = 0
i = -1
if size(/type,name) eq 7 and keyword_set(index) then $
i = (where(name eq index.name,n))[0]
if n ge 2 then message,'Error'
if keyword_set(set) then begin
if keyword_set(info) then begin
if n eq 0 then begin
f.name = name
f.ptr = ptr_new(info)
index = keyword_set(index) ? [index,f] : [f]
endif else begin
*index[i].ptr = info
endelse
endif else begin
if n ne 0 then begin
ptr_free,index[i].ptr
ni = where(name ne index.name,n)
if n ne 0 then index=index[ni] else index=0
endif
endelse
return
endif
if keyword_set(get) then begin
info = (n ne 0) ? *index[i].ptr : 0
return
endif
if not keyword_set(index) then begin
dprint, 'Nothing stored!'
return
endif
if n_elements(name) eq 0 then begin
dprint, transpose(["'"+ index.name +"'"])
return
endif
if i ge 0 then printdat,index[i] else dprint, 'Name not found!'
end
pro file_YYYYMMDD_to_time,allfiles
datepos = 16
n = n_elements(allfiles)
pos = strlen(allfiles.name)-datepos
if n gt 1 then $
date = long(strmid(allfiles.name,transpose(pos),8)) $
else date = long(strmid(allfiles.name,pos,8))
t = replicate(time_struct(0d),n)
t.year = date/10000
date = date mod 10000
t.month = date/100
t.date = date mod 100
allfiles.start= time_double(t)
st = sort(allfiles.start)
allfiles = allfiles[st]
allfiles.stop = allfiles.start + 86400d -1d
end
pro file_bartel_to_time,allfiles
datepos = 12
n = n_elements(allfiles)
pos = strlen(allfiles.name)-datepos
bartnum = long(strmid(allfiles.name,transpose(pos),4))
allfiles.start= bartel_time(bartnum)
st = sort(allfiles.start)
allfiles = allfiles[st]
allfiles.stop = shift(allfiles.start,-1) - 1d
allfiles[n-1].stop = allfiles[n-1].start + 27*86400d - 1d
end
function cdf_file_names,format, pathname=pathname, use_master=use_master, $
trange=trange,nfiles=n,fileinfo=fileinfo,reset=reset,verbose=verbose,$
routine=routine
ts_ = systime(1)
tr=timerange(trange)
if keyword_set(fileinfo) then dprint,'FILEINFO keyword is obsolete'
mfileformat = {mfileformat, name:'',start:0d,stop:0d,len:0l}
n=0
if getenv('FILE_ENV_SET') ne '1' then setfileenv
if size(/type,format) ne 7 then begin
dprint,'Input format must be a string'
return,''
endif
if keyword_set(format) then begin
envformat = getenv( strupcase(format) )
if keyword_set(envformat) then begin
if keyword_set(verbose) then $
dprint, 'Environment variable: ',strupcase(format),' Found.'
endif
if not keyword_set(envformat) then envformat = format
if keyword_set(use_master) then envformat = format
if strpos(envformat,'*') ge 0 or strpos(envformat,'?') ge 0 then begin
pathname=envformat
indexfile = 0
endif else begin
if file_test(envformat,/reg,/read) then begin
pathname = envformat
indexfile = 1
endif else begin
envformat2 = filepath(envformat,root=getenv('CDF_INDEX_DIR'))
if file_test(envformat2,/reg,/read) then begin
pathname = envformat2
indexfile=1
endif else begin
if keyword_set(verbose) then dprint, 'Using default path.'
parts = strsplit(envformat,/extr,'_')
parts = parts[[0,1,2]]
pathname=getenv('BASE_DATA_DIR')+'/'+strjoin(parts,'/')+'/????/*.*'
indexfile=0
endelse
endelse
endelse
endif else begin
dprint,'FORMAT must be set'
return,''
endelse
cdf_file_names_index,format,fileinfo,/get
if keyword_set(fileinfo) then begin
reset_time = 3600.*2
allfiles=fileinfo.allfiles
if fileinfo.indexfile ne indexfile then allfiles=0
if fileinfo.pathname ne pathname then allfiles=0
if indexfile then begin
openr,lun,pathname,/get_lun
stat=fstat(lun)
free_lun,lun
if stat.mtime gt fileinfo.timestamp then begin
if keyword_set(verbose) then dprint, 'Index file has been modified!'
allfiles=0
endif
endif else begin
if fileinfo.timestamp+reset_time lt ts_ then begin
allfiles=0
if keyword_set(verbose) then dprint, 'Timer elapsed, checking for more files.'
endif
endelse
if keyword_set(reset) then allfiles=0
endif
if not keyword_set(allfiles) then begin
datepos = 16
if indexfile then begin
if keyword_set(verbose) then dprint, "Searching for files in: indexfile='",pathname,"'"
on_ioerror,bad_file
openr,lun,pathname,/get_lun
mf = mfileformat
while not eof(lun) do begin
s = ''
readf,lun,s
ss = strsplit(s,/extract)
ns = n_elements(ss)
mf.start = time_double(ss[0])
mf.stop = time_double(ss[1])
mf.name = ss[2]
mf.len = (ns gt 3) ? long(ss[3]) : 0
append_array,allfiles,mf,index=n
endwhile
append_array,allfiles,index=n,/done
free_lun,lun
endif else begin
if keyword_set(verbose) then dprint, "Searching for files in: pathname='",pathname,"'"
allfnames=file_search(pathname,count=n)
if n eq 0 then begin
dprint,'No files found in path: "'+pathname+'"'
return,''
endif
allfiles = replicate(mfileformat,n)
allfiles.name = allfnames
if not keyword_set(routine) then begin
if strpos(pathname,'bartel') ge 0 then routine='file_BARTEL_to_time' $
else routine='file_YYYYMMDD_to_time'
endif
call_procedure,routine,allfiles
endelse
if n ge 2 then begin
p = strpos(allfiles.name,'/',/reverse_search)
fn1 = strmid(allfiles.name,transpose(p+1))
st = sort(fn1)
allfiles = allfiles[st]
fn1=fn1[st]
l = strlen(fn1)
fn2 = strmid(fn1,0,transpose(l-datepos+8))
dup = fn2 eq shift(fn2,-1)
dup[n-1] = 0
wdup = where(dup,ndup)
if ndup ne 0 then begin
if indexfile then dprint, 'The indexfile ',pathname,' has the following duplicate entries:' $
else dprint, 'The following files are either duplicate or earlier version files and should be deleted:'
dprint, allfiles[transpose(wdup)].name
endif
allfiles = allfiles[where(dup eq 0)]
allfiles = allfiles[sort(allfiles.start)]
endif
fileinfo = {timestamp:ts_,pathname:pathname,indexfile:indexfile,allfiles:allfiles}
if not keyword_set(allfiles) then fileinfo=0
endif
cdf_file_names_index,format,fileinfo,/set
n = n_elements(allfiles) * keyword_set(allfiles)
if n eq 0 then begin
dprint,'No matching files found!'
return,''
endif
w = where(allfiles.stop ge tr[0] and allfiles.start lt tr[1] ,n)
if n ne 0 then files=allfiles[w].name else files=''
n2=0
if n ne 0 then w = where( file_test(files) ,n2)
if n2 gt 0 then files = files[w] else files=''
n=n2
if keyword_set(verbose) then $
dprint, n,' of ',n_elements(allfiles),' Files found in ',systime(1)-ts_ ,' seconds'
return,files
bad_file:
dprint,'Unable to open index file: '+pathname
return,''
end