jms@tardis.Tymnet.COM (Joe Smith) (01/08/91)
I asked: "How do you scan a directory that may have filenames with embedded
blanks". I got help from Francois Rouaix <rouaix@margaux.inria.fr>.
Many REXX string functions take an optional extra argument to specify
the pad character. Sure enough, showdir() takes a 3rd arg.
The statement "files=showdir(thisdir)" is the same as
"files=showdir(thisdir,'all','20'x)" in that it lists all types of files
in the directory thisdir, and separates the names with blanks ('20'x).
The only character guaranteed not to be part of any filename is '00'x.
/* LISTDIR - List directory and its subdirectories, using relative path names.
This AREXX script was created because the 'LIST ALL LFORMAT=' command can
be made to output 1) just the filename, or 2) the absolute path name
(including volume name), but not 3) path name relative to current directory.
*/
parse arg topdir opts .
if topdir = "" then do
parse source . . myname . /* get name of this script */
say 'Usage: rx' myname 'directory-name'
say ' To list all files and subdirectories of "directory-name".'
say 'Usage: rx >RAM:temp' myname '"" QUICK'
say ' To list just the filenames only. "" means current directory.'
say ' The options FILES and DIRS also produce a QUICK listing.'
exit
end
quickflag = abbrev("QUICK",upper(opts),1) /* no sizes, dates, etc */
filesonly = abbrev("FILES",upper(opts),1) /* list files only, QUICK */
dirsonly = abbrev("DIRS",upper(opts),1) /* directorys only, QUICK */
call addlib('rexxsupport.library',0,-30,0) /* in case not already added */
if topdir = "''" | topdir = '""' then topdir = "" /* default directory */
if word(statef(topdir),1) ~= "DIR" then say "Error:" topdir "is not a directory"
else call scandir topdir /* do recursive directory traversal */
exit
scandir: procedure expose quickflag filesonly dirsonly
parse arg dir /* variable 'dir' may contain blanks and lowercase letters */
slash = "/"
if right(dir,1) = ":" | dir = "" then slash = ""
if dirsonly then file = "dir"; else file = "all"
files = showdir(dir,file,'00'x) /* list of files, separated by NULL bytes*/
do while words(files) > 0
delimiter = pos('00'x,files) /* locate the NULL */
if delimiter = 0 then delimiter = length(files)+1 /* only one name */
file = dir||slash||substr(files,1,delimiter-1) /* first name */
files = substr(files,delimiter+1) /* all but 1st name */
sf = statef(file) /* note: filename may contain embedded blanks*/
/* statef returns {DIR|FILE} length blocks protect days mins ticks note... */
if sf = "" then say "Cannot locate" file
else do
if quickflag | filesonly | dirsonly then do
if word(sf,1) = "FILE"& ~dirsonly then say file
if word(sf,1) = "DIR" & ~filesonly then say file
end
else do
f=left(word(sf,1),4)||right(word(sf,2),8)||right(word(sf,3),5)||dat(sf)
say f file
if word(sf,8) ~= "" then say ":" subword(sf,8) /* list the filenote */
end
if word(sf,1) = "DIR" then call scandir file /* process subdir */
end
end
return
dat: procedure /* returns date/time as " YY/MM/DD HH:MM" */
arg stat
/* seconds = word(stat,7)%50 */
minutes = word(stat,6)//60
if minutes < 10 then minutes = "0"||minutes
hours = word(stat,6)% 60
if hours < 10 then hours = "0"||hours
return ' '||date('O',word(stat,5),I)||' '||hours||':'||minutes
/* End of Rexx:ListDir.rexx */
--
Joe Smith (408)922-6220 | SMTP: jms@tardis.tymnet.com or jms@gemini.tymnet.com
BT Tymnet Tech Services | UUCP: ...!{ames,pyramid}!oliveb!tymix!tardis!jms
PO Box 49019, MS-C51 | BIX: smithjoe | CA license plate: "POPJ P," (PDP-10)
San Jose, CA 95161-9019 | humorous dislaimer: "My Amiga 3000 speaks for me."new@ee.udel.edu (Darren New) (01/09/91)
In article <1406@tardis.Tymnet.COM> jms@tardis.Tymnet.COM (Joe Smith) writes: >The only character guaranteed not to be part of any filename is '00'x. Not really true. It is possible to put a \0 in the file name by using BSTRs instead of C strings. The only character that cannot be in a OFS or FFS file name is a slash. Even that could be put in a name with a disk editor, if nothing else. However, I imagine there would be problems openning it if nothing else. -- Darren -- --- Darren New --- Grad Student --- CIS --- Univ. of Delaware --- ----- Network Protocols, Graphics, Programming Languages, Formal Description Techniques (esp. Estelle), Coffee, Amigas ----- =+=+=+ Let GROPE be an N-tuple where ... +=+=+=