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...
dir
or ls
, where you have to
live with the way they format their output
and somehow cope with it.
-- ClausBrod - 11 Oct 2005