; docformat = 'rst'
;+
; This class represents a filename (or directory name).
;
; This class corrects many of the errors found in FILEPATH, FILE_DIRNAME, and
; FILE_BASENAME.
;
; :Properties:
; dirname
; characters before the last path separator in the filename; empty if no
; path separator
; directories
; array of directories as listed in dirname
; basename
; characters after the last path separator in the filename; the entire
; filename if no path separator
; extension
; characters after the last dot in the basename
;-
;+
; Get properties.
;-
pro mgfffilename::getProperty, extension=extension, basename=basename, $
dirname=dirname, directories=directories
compile_opt strictarr
seppos = strpos(self.filename, path_sep(), /reverse_search)
if (arg_present(basename) || arg_present(extension)) then begin
basename = seppos eq -1L ? $
self.filename $
: strmid(self.filename, seppos + 1L)
endif
if (arg_present(dirname) || arg_present(directories)) then begin
dirname = seppos eq -1L ? '.' : strmid(self.filename, 0, seppos)
dirname += path_sep()
endif
if (arg_present(directories)) then begin
directories = strsplit(dirname, path_sep(), /extract)
endif
if (arg_present(extension)) then begin
dotpos = strpos(basename, '.', /reverse_search)
extension = dotpos eq -1L ? '' : strmid(basename, dotpos + 1L)
endif
end
;+
; Set properties.
;-
pro mgfffilename::setProperty, extension=extension
compile_opt strictarr
if (n_elements(extension) gt 0L) then begin
seppos = strpos(self.filename, path_sep(), /reverse_search)
basename = seppos eq -1L ? $
self.filename $
: strmid(self.filename, seppos + 1L)
dotpos = strpos(basename, '.', /reverse_search)
self.filename = dotpos eq -1L $
? (self.filename + '.' + extension) $
: (strmid(self.filename, 0, seppos + 1L) $
+ strmid(basename, 0, dotpos + 1L) $
+ extension)
endif
end
;+
; Create a filename by specifying its parts. Parts are assumed to be empty if
; not specified (unlike `FILEPATH`).
;
; :Params:
; basename : in, optional, type=string, default=''
; basename or full filename of filename
;
; :Keywords:
; clock_basename : in, optional, type=boolean
; set to use `basename` as a C-style format string to insert the number
; of milliseconds since 1 January 1970 into
; subdirectory : in, optional, type=string/strarr, default=''
; subdirectory or subdirectories
; root_dir : in, optional, type=string, default=''
; root directory
; tmp : in, optional, type=boolean
; set to ignore `ROOT_DIR` keyword and use a root directory specially
; designated for temporary files
;-
pro mgfffilename::compose, basename, clock_basename=clockBasename, $
subdirectory=subdirectory, $
tmp=tmp, root_dir=rootDir
compile_opt strictarr
if (keyword_set(tmp)) then begin
_root = getenv('IDL_TMPDIR')
endif else _root = n_elements(rootDir) eq 0L ? '' : rootDir
; add path_sep() to the end of the root if not there already
if (strlen(_root) gt 0L $
&& strmid(_root, strlen(_root) - 1L) ne path_sep()) then begin
_root += path_sep()
endif
_subdir = n_elements(subdirectory) eq 0L $
? '' $
: (strjoin(subdirectory, path_sep()) + path_sep())
_basename = n_elements(basename) eq 0L ? '' : basename
if (keyword_set(clockBasename)) then begin
t = 1000.D * systime(/seconds)
_basename = string(t, format='(%"' + _basename + '")')
endif
self.filename = _root + _subdir + _basename
end
;+
; Returns the filename as a string.
;
; :Returns:
; string
;
; :Keywords:
; format : in, optional, type=string
; format string with a single string specifier in it (%s or A, depending
; on the format type) in it
;-
function mgfffilename::toString, format=format
compile_opt strictarr
return, string(self.filename, format=format)
end
;+
; Free resources.
;-
pro mgfffilename::cleanup
compile_opt strictarr
end
;+
; Create a filename object.
;
; :Params:
; basename : in, optional, type=string
; basename or full filename of the new filename object
;
; :Keywords:
; _ref_extra : in, out, optional, type=keywords
; input keywords to ::compose and output keywords to ::getProperty
;-
function mgfffilename::init, basename, _ref_extra=e
compile_opt strictarr
self->compose, basename, _extra=e
self->getProperty, _extra=e
return, 1
end
;+
; Define instance variables.
;
; :Fields:
; filename
; filename this object represents
;-
pro mgfffilename__define
compile_opt strictarr
define = { MGffFilename, filename: '' }
end