CoCreate Modeling: A platform-independent ls -l replacement
Oftentimes, users overlook the wealth of file handling functionality which is built-in
into Common Lisp and also into CoCreate Modeling's dialect of the language. Way too often,
it is assumed that any kind of OS-level work should best be done by calling
external components, for example by running DOS or UNIX utilities via a command
shell. If you need access to external utilities,
oli:sd-sys-exec
is your friend,
but as a rule of thumb, if you're using
oli:sd-sys-exec
, chances are that there are
much better and less platform-dependent ways to achieve the same.
As an example, here is some code which does the rough equivalent of
ls -l /some/directory/*somepattern* >somelogfile
Sure enough, the command-line above looks simple and takes only a few seconds
to type, but it simply doesn't port to non-UNIX systems (except if you install
a UNIX-like shell environment on them). Here's a platform-independent
approximation:
;; -*-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Description: Platform-independent replacement for ls -l
;; Author: Claus Brod
;; Language: Lisp
;;
;; (C) Copyright 2005 Claus Brod, all rights reserved
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
(in-package :clausbrod.de)
(export 'ls-l)
(defun file-mod-time(f)
(multiple-value-bind (sec minutes hour date month year)
(decode-universal-time (file-write-date f))
(format nil "~D/~2,'0D/~2,'0D ~2,'0D:~2,'0D:~2,'0D" year month date hour minutes sec)))
(defun print-file-info(s f)
(format s "~A ~A ~A~%" (file-namestring f) (file-mod-time f)
(oli:sd-inq-file-size (file-namestring f))))
(defun ls-l(dir pattern logfile)
(oli:sd-with-current-working-directory dir
(with-open-file (s logfile :direction :output :if-exists :supersede)
(dolist (f (directory pattern))
(print-file-info s f)))))
Usage example:
(clausbrod.de:ls-l "c:/temp" "*.pkg" "pkg.log")
It's too bad that Common Lisp doesn't have a direct equivalent of
strftime - this
would have saved me from
format's funky parameter syntax. But still, now
we've got code which...
- ... is platform-independent,
- ... does not need to fork costly external processes to do its job,
- ... is adaptable to particular formatting requirements, unlike
external utilities such as
dir
or ls
, where you have to
live with the way they format their output
and somehow cope with it.
--
ClausBrod - 11 Oct 2005
to top